компонентът трябва да се показва на екрана, за да се определи местоположението му при промяна на 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: Ако сте нов, тогава е идеалният момент да разгледате API на Java и по-специално неговия запис в 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
имам основния си GUI, работещ на този екран, така че не съм сигурен как да го стартирам сам.. и какво имате предвид под файл с данни? съжалявам - person Vaughan D; 17.05.2015
comment
@VaughanD: защо вашият reader(...) метод връща null?? Чрез файл с данни, данните, които се четат от четеца и след това се използват в JComboBox. - person Hovercraft Full Of Eels; 17.05.2015
comment
о, съжалявам, и не можах да го заобиколя, без да връща null.. имах първото връщане и eclipse му дава грешка, а файлът с данни е просто *** линия Belgrave *** Parliament Station Melbourne Central Station Flagstaff Station Southern Cross Station Flinders Street Station Richmond Station East Richmond Station Burnley Station Hawthorn Station Glenferrie Station Auburn Station За съжаление не мога да форматирам отговорите. но има само отделни редове - person Vaughan D; 17.05.2015
comment
@VaughanD: Опитах се да стартирам кода ви, след като го модифицирах, за да не се нуждае от файл, но не мога да възпроизведа проблема ви. Вижте кода по-горе. - person Hovercraft Full Of Eels; 17.05.2015
comment
да, виждам как би било трудно, опитах се да внедря SwingUtilities.invokeLater(new Runnable() { защото прочетох, че помага, но все още ми дава грешките... BTW, когато казваш засенчващи променливи, какво правиш Опитвам се да запазя низа, който потребителят избира. с групата бутони.. - 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