компонент должен отображаться на экране, чтобы определить его местоположение при изменении JCOMBOX

Я получаю эту ошибку, когда меняю элементы в Jcombobox, ничего не ломается, просто показывает эту ошибку, можно ли просто выбросить ее, чтобы она не отображалась. все по-прежнему работает нормально, но если вы хотите взглянуть на код. я опубликую ниже.

Сообщение об ошибке:

java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
at java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:2056)
at java.awt.Component.getLocationOnScreen(Component.java:2030)
at sun.lwawt.macosx.CAccessibility$23.call(CAccessibility.java:395)
at sun.lwawt.macosx.CAccessibility$23.call(CAccessibility.java:393)
at sun.lwawt.macosx.LWCToolkit$CallableWrapper.run(LWCToolkit.java:538)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301)

И мой код, который я не знаю, какой раздел показать, так что это все их.

import javax.swing.*;

import java.awt.Dialog.ModalityType;
import java.awt.event.*;
import java.awt.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;

public class TouchOn extends JDialog {
private JPanel mainPanel;


public ArrayList Reader(String Txtfile) {
    try {

    ArrayList<String> Trains = new ArrayList<String>();
    int count = 0;
    String testing = "";
    File file = new File(Txtfile);
    FileReader fileReader = new FileReader(file);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    StringBuffer stringBuffer = new StringBuffer();
    String line;
    while ((line = bufferedReader.readLine()) != null) 
    {
        stringBuffer.append(line);
        count += count;
        if(!line.contains("*")){
            Trains.add(line + "\n");
        }
        stringBuffer.append("\n");



    }
    fileReader.close();
    //Arrays.asList(Trains).stream().forEach(s -> System.out.println(s));
    return Trains;
} catch (IOException e) {
    e.printStackTrace();
}
//return toString();
return null;


}


public TouchOn()
{
    setPanels();

    setModalityType(ModalityType.APPLICATION_MODAL);
    setSize(400, 300);
    setVisible(true);
}
public void setPanels()
{
    mainPanel = new JPanel(new GridLayout(0, 2));
    JPanel containerPanel = new JPanel(new GridLayout(0, 1));
    JLabel startDay = new JLabel("Day:");
    JTextField sDay = new JTextField();

    JLabel startMonth = new JLabel("Month:");
    JTextField sMonth = new JTextField();

    JLabel startYear = new JLabel("Year:");
    JTextField sYear = new JTextField("2015");
    String trainline = "";

    JLabel touchOnTimehr = new JLabel("Time Hour: ");
    JLabel touchOnTimem = new JLabel("Time Minute:");
    JLabel station = new JLabel("Station: ");


    JTextField touchOnTimeFieldhour = new JTextField();
    JTextField touchOnTimeFieldminute = new JTextField();

    JPanel lowerPanel = new JPanel(new FlowLayout());
    ArrayList<String> stations = Reader("TrainLines.txt");
    JComboBox<String> cb = new JComboBox<>(stations.toArray(new String[stations.size()]));
    JRadioButton belgrave = new JRadioButton("Belgrave Line");
    belgrave.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){

            }
    });
    JRadioButton glenwaverly = new JRadioButton("Glen Waverly Line");
    glenwaverly.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){

        }
    });
    ButtonGroup bG = new ButtonGroup();
    JButton apply = new JButton("Touch on");
    JButton cancel = new JButton("Cancel");
    cancel.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            dispose();
        }
    });
    apply.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {


String timestamp = new java.text.SimpleDateFormat("dd/MM/yyyy").format(new Date());
            String day = sDay.getText();
            String month = sMonth.getText();
            String year = sYear.getText();
            String hour = touchOnTimeFieldhour.getText();
            String minute = touchOnTimeFieldminute.getText();
            if(belgrave.isSelected()){
                String trainline = belgrave.getText();
            }
            if(glenwaverly.isSelected()){
                String trainline = glenwaverly.getText();
            }
            System.out.println(trainline);
        }
    });



    cb.setVisible(true);
    bG.add(belgrave);
    bG.add(glenwaverly);
    mainPanel.add(startDay);
    mainPanel.add(sDay);
    mainPanel.add(startMonth);
    mainPanel.add(sMonth);
    mainPanel.add(startYear);
    mainPanel.add(sYear);
    mainPanel.add(touchOnTimehr);
    mainPanel.add(touchOnTimeFieldhour);
    mainPanel.add(touchOnTimem);
    mainPanel.add(touchOnTimeFieldminute);
    mainPanel.add(belgrave);
    mainPanel.add(glenwaverly);
    mainPanel.add(station);
    mainPanel.add(new JLabel());
    mainPanel.add(cb);
    lowerPanel.add(apply);
    lowerPanel.add(cancel);
    touchOnTimeFieldhour.setSize(10,10);
    containerPanel.add(mainPanel);
    containerPanel.add(lowerPanel);

    add(containerPanel);
}

}

person Vaughan D    schedule 17.05.2015    source источник


Ответы (1)


Не создавайте несколько JComboBox, а затем меняйте видимость. Вместо этого используйте один JComboBox и создайте несколько моделей поля со списком, например, с помощью DefaultComboBoxModel<String>, а затем замените модель, которую он содержит, с помощью его метода setModel(...). Проблема решена.


Обратите внимание, что, используя вариант вашего кода, я не могу воспроизвести вашу проблему:

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.AbstractAction;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class TestFoo2 {

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndDisplayGui();
         }
      });
   }

   public static void createAndDisplayGui() {
      final JFrame frame = new JFrame("Foo");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      JButton button = new JButton(new AbstractAction("Press Me") {

         @Override
         public void actionPerformed(ActionEvent evt) {
            TouchOn2 touchOn2 = new TouchOn2(frame);
            touchOn2.setVisible(true);
         }
      });

      JPanel panel = new JPanel();
      panel.add(button);
      frame.add(panel);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }
}

@SuppressWarnings("serial")
class TouchOn2 extends JDialog {
   private JPanel mainPanel;

   @SuppressWarnings({ "rawtypes", "unused" })
   public ArrayList Reader(String Txtfile) {
      ArrayList<String> list = new ArrayList<>();
      for (int i = 0; i < 100; i++) {
         list.add("Data String Number " + (i + 1));
      }

      // return toString();
      // !! return null;
      return list;
   }

   public TouchOn2(Window owner) {
      super(owner);
      setPanels();

      setModalityType(ModalityType.APPLICATION_MODAL);
      setSize(400, 300);
      setVisible(true);
   }

   @SuppressWarnings("unchecked")
   public void setPanels() {
      mainPanel = new JPanel(new GridLayout(0, 2));
      JPanel containerPanel = new JPanel(new GridLayout(0, 1));
      JLabel startDay = new JLabel("Day:");
      final JTextField sDay = new JTextField();

      JLabel startMonth = new JLabel("Month:");
      final JTextField sMonth = new JTextField();

      JLabel startYear = new JLabel("Year:");
      final JTextField sYear = new JTextField("2015");
      final String trainline = "";

      JLabel touchOnTimehr = new JLabel("Time Hour: ");
      JLabel touchOnTimem = new JLabel("Time Minute:");
      JLabel station = new JLabel("Station: ");

      final JTextField touchOnTimeFieldhour = new JTextField();
      final JTextField touchOnTimeFieldminute = new JTextField();

      JPanel lowerPanel = new JPanel(new FlowLayout());
      ArrayList<String> stations = Reader("TrainLines.txt");
      final JComboBox<String> cb = new JComboBox<>(
            stations.toArray(new String[stations.size()]));
      final JRadioButton belgrave = new JRadioButton("Belgrave Line");
      belgrave.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {

         }
      });
      final JRadioButton glenwaverly = new JRadioButton("Glen Waverly Line");
      glenwaverly.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {

         }
      });
      ButtonGroup bG = new ButtonGroup();
      JButton apply = new JButton("Touch on");
      JButton cancel = new JButton("Cancel");
      cancel.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            dispose();
         }
      });
      apply.addActionListener(new ActionListener() {
         @SuppressWarnings("unused")
         public void actionPerformed(ActionEvent e) {

            String timestamp = new java.text.SimpleDateFormat("dd/MM/yyyy")
                  .format(new Date());
            String day = sDay.getText();
            String month = sMonth.getText();
            String year = sYear.getText();
            String hour = touchOnTimeFieldhour.getText();
            String minute = touchOnTimeFieldminute.getText();
            if (belgrave.isSelected()) {
               // !! ***** note you're shadowing variables here!!!! ****
               String trainline = belgrave.getText();
            }
            if (glenwaverly.isSelected()) {
               // !! and here too
               String trainline = glenwaverly.getText();
            }
            System.out.println(trainline);
         }
      });

      cb.setVisible(true);
      bG.add(belgrave);
      bG.add(glenwaverly);
      mainPanel.add(startDay);
      mainPanel.add(sDay);
      mainPanel.add(startMonth);
      mainPanel.add(sMonth);
      mainPanel.add(startYear);
      mainPanel.add(sYear);
      mainPanel.add(touchOnTimehr);
      mainPanel.add(touchOnTimeFieldhour);
      mainPanel.add(touchOnTimem);
      mainPanel.add(touchOnTimeFieldminute);
      mainPanel.add(belgrave);
      mainPanel.add(glenwaverly);
      mainPanel.add(station);
      mainPanel.add(new JLabel());
      mainPanel.add(cb);
      lowerPanel.add(apply);
      lowerPanel.add(cancel);
      touchOnTimeFieldhour.setSize(10, 10);
      containerPanel.add(mainPanel);
      containerPanel.add(lowerPanel);

      add(containerPanel);
   }

}
person Hovercraft Full Of Eels    schedule 17.05.2015
comment
ВАУ, подожди что, setModels()? Я не уверен, как это сделать, я очень новичок в этом, и у меня была проблема, как вы можете сказать по закомментированному коду, поэтому я просто подумал, что это проще - person Vaughan D; 17.05.2015
comment
@VaughanD: Если вы новичок, сейчас самое время ознакомиться с Java API и, в частности, его запись в DefaultComboBoxModel. Он расскажет вам, какие конструкторы и методы доступны для этого класса. - person Hovercraft Full Of Eels; 17.05.2015
comment
хорошо, я сделал все это одним полем со списком, и я все еще получаю сообщение об ошибке при выборе разных элементов списка - person Vaughan D; 17.05.2015
comment
@VaughanD: Трудно понять, что не так, не видя последний код и сообщение об ошибке. Пожалуйста, отредактируйте исходный вопрос (нажмите на ссылку, которую я предоставил) и добавьте свой последний код в конце вашего вопроса. . - person Hovercraft Full Of Eels; 17.05.2015
comment
@VaughanD: какая строка вызывает исключение? - person Hovercraft Full Of Eels; 17.05.2015
comment
не сказано какая линия. но когда я изменяю значение поля со списком, будет ли это потому, что нет действия по его изменению? - person Vaughan D; 17.05.2015
comment
@VaughanD: я пытаюсь запустить ваш код, но пока не могу. Как выглядит файл данных? - person Hovercraft Full Of Eels; 17.05.2015
comment
у меня есть мой основной графический интерфейс, работающий на этом экране, поэтому я не уверен, как запустить его сам по себе ... и что вы подразумеваете под файлом данных? простите - person Vaughan D; 17.05.2015
comment
@VaughanD: почему ваш метод reader(...) возвращает null ?? По файлу данных данные, которые считываются программой чтения и затем используются в JComboBox. - person Hovercraft Full Of Eels; 17.05.2015
comment
о, извините, и я не мог обойти это, не возвращая ноль .. у меня был первый возврат, и затмение выдает ошибку, а файл данных просто *** Белгрейвская линия *** Парламентский вокзал Мельбурн Центральный вокзал Флагстафф Станция Южный Станция Кросс Станция Флиндерс Стрит Станция Ричмонд Станция Ист Ричмонд Станция Бернли Станция Хоторн Станция Гленферри Станция Оберн Станция Извините, я не могу форматировать ответы. а там просто отдельные строки - person Vaughan D; 17.05.2015
comment
@VaughanD: я пытался запустить ваш код после его изменения, чтобы не нуждаться в файле, но я не могу воспроизвести вашу проблему. См. код выше. - person Hovercraft Full Of Eels; 17.05.2015
comment
да, я вижу, как это будет сложно, я попытался реализовать SwingUtilities.invokeLater(new Runnable() { потому что я читал, что это помогает, но все еще дает мне ошибки... Кстати, когда вы говорите, что затенение переменных, что вы делаете значит? Я пытаюсь сохранить строку, которую выбирает пользователь, с помощью группы кнопок.. - person Vaughan D; 17.05.2015
comment
@VaughanD: строки trainLine, объявленные в блоках if и else, видны только внутри этих блоков. Переменная String с тем же именем, объявленная в вашем методе setPanels, является совершенно отдельной и отдельной переменной. Изменение состояния переменных в блоке if не повлияет на переменную, объявленную в методе. Я думаю, что, возможно, вы захотите объявить одну переменную trainLine и объявить ее как переменную экземпляра внутри класса. - person Hovercraft Full Of Eels; 17.05.2015
comment
@VaughanD: обратите внимание на похожий вопрос. - person Hovercraft Full Of Eels; 17.05.2015
comment
Хорошо, из процесса выключения его моя функция чтения выводит текстовый файл в массивы с каждой новой строкой. но я не уверен, как сделать чтение текстового файла другим способом. - person Vaughan D; 17.05.2015
comment
@VaughanD: Предполагается ли читать один файл станций для каждого JRadioButton? Как называются файлы? Есть ли в файлах имена переключателей внутри них? Я бы считывал данные непосредственно в объекты DefaultComboBoxModel<String> и связывал каждый объект модели со строкой (имя строки), используя объект HashMap<String, ComboBoxModel>. Это позволит легко менять модели. - person Hovercraft Full Of Eels; 17.05.2015
comment
Я решил просто иметь 2 переключателя и один раскрывающийся список со всеми станциями. так что один основной текстовый файл, содержащий все железнодорожные станции. и всего две радиокнопки. поэтому нет необходимости менять модели. потому что мне стало трудно понять. - person Vaughan D; 17.05.2015