JColorChooser и JFileChooser открывают проблему - PullRequest
0 голосов
/ 30 сентября 2010

Я хочу показать диалоги JColorChooser и JFileChooser программно из метод, вызываемый при отправке кнопок.

После нажатия кнопки вызывается метод, но диалоговые окна не отображаются.

У меня есть JFrame с нулевой разметкой (абсолютное позиционирование) и, например, следующий код:

public class _TEST_ extends JFrame
{
    private JColorChooser color_chooser;
    private JFileChooser file_chooser;

    public _TEST_()
    {
        super("_TEST_");

        setLayout(null);

        final JButton b = new JButton("Color chooser");
        final JButton b2 = new JButton("File chooser");

        ActionListener al = new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                if (e.getSource() == b)
                {
                    createJColorChooser();
                }
                else if (e.getSource() == b2)
                {
                    createJFileChooser();
                }
            }
        };

        b.addActionListener(al);
        b2.addActionListener(al);

        b.setBounds(1, 1, 160, 20);
        b2.setBounds(1, 30, 160, 20);

        add(b);
        add(b2);
    }

    public void createJColorChooser()
    {
        color_chooser = new JColorChooser();
        color_chooser.setBounds(1, 70, 225, 50);
        add(color_chooser);
        repaint();
    }

    public void createJFileChooser()
    {
        file_chooser = new JFileChooser();
        file_chooser.setBounds(330, 70, 225, 50);
        add(file_chooser);
        repaint();
    }

    public static void main(String args[])
    {
        _TEST_ window = new _TEST_();
        window.setSize(800, 600);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
        window.setLocationRelativeTo(null);
    }
}

что не так?

Ответы [ 3 ]

2 голосов
/ 30 сентября 2010

Если вы добавляете в фрейм, который уже был сделан видимым, вам необходимо повторно проверить фрейм:

frame.validate();

Из JavaDocs для frame.add (...):

Примечание. Если компонент был добавлен в отображаемый контейнер, в этом контейнере должна быть вызвана validate для отображения нового компонента.

Если вы хотите сделать цветshow chooser в отдельном диалоге (обычный подход), сделайте это:

final Color color = JColorChooser.showDialog(null, "Choose a color", Color.BLUE); 

Для JFileChooser здесь типичный подход:

JFileChooser ch = new JFileChooser();
ch.showOpenDialog(null);

JavaDocs для этих двух диалогов работают хорошопримеры.

1 голос
/ 30 сентября 2010

(См. Комментарии в ответе *1001* @Steve McLeod для контекста.)

JColorChooser и JFileChooser не являются регулярными JComponent с.Вы можете добавить их в контейнер, но ничего не видите, потому что пользовательский интерфейс JColorChooser не рисует, а JFileChooser даже не имеет пользовательского интерфейса.

Как и в ответе Стива, выможно использовать JColorChooser#showDialog и JFileCHooser#showOpenDialog для получения модального диалога, который является правильным способом их использования.

Если вы действительно хотите, вы можете позвонить JColorChooser#createDialog, а затем захватить его содержимоепанель (вы можете сделать это для любого контейнера верхнего уровня):

public void createJColorChooser()
{
    ...
    add(JColorChooser.createDialog(this, "", false, color_chooser, null, null).getContentPane());
    ...
}

И вы можете переопределить JFileChooser, чтобы опубликовать его createDialog, но, пожалуйста, не делай этого.Выбор файла должен всегда быть модальными диалогами.

1 голос
/ 30 сентября 2010

Обычно я добавляю компоненты к конкретной панели, а не к рамке напрямую, поэтому я бы использовал:

panel.add( someComponent );
panel.revalidate();
panel.repaint(); // sometimes required

Но в этом случае вы можете просто использовать метод validate ():

color_chooser.setSize( color_chooser.getPreferredSize() );
add(color_chooser); 
validate();
repaint(); 


file_chooser.setSize( file_chooser.getPreferredSize() );
add(file_chooser);  
validate();
repaint();  

Редактировать: конечно, вы должны также использовать предпочтительный размер компонента, чтобы весь компонент был виден. Теперь все, что вам нужно сделать, это добавить весь код, чтобы ответить, когда пользователь делает выбор. Это большая работа, поэтому лучше использовать диалоговую версию каждого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...