Почему после того, как я добавил JComboBox в один из JPanels, все JPanels не были обработаны - PullRequest
0 голосов
/ 06 ноября 2019

Когда JComboBox, cmbox не было добавлено к JPanel, можно отобразить две панели p1 & p2. Вы можете закомментировать часть поля со списком, чтобы увидеть результат. Но после того, как я добавил поле со списком в одну из панелей, все панели не были отрисованы.

Мой код похож на следующий:

import java.awt.*;
import javax.swing.*;

public class TestCombo {

    public static void main(String[] args) {
        JFrame frame = new JFrame("康樂彩歌");
        frame.setVisible(true);
        frame.setBounds(0, 0, 1368, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel p1 = new JPanel();
        p1.setBackground(Color.CYAN);

        JRadioButton rb1 = new JRadioButton("加簡譜", false);
        rb1.setFont(new Font("新細明體", Font.PLAIN, 20));

        JRadioButton rb2 = new JRadioButton("加人聲", false);
        rb2.setFont(new Font("新細明體", Font.PLAIN, 20));

        rb1.setBounds(450, 180, 50, 50);
        rb2.setBounds(500, 180, 50, 50);

        JButton btPlay = new JButton("PLAY");
        btPlay.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD, 25));
        btPlay.setBounds(100, 20, 100, 20);//x axis, y axis, width, height  

        JButton btStop = new JButton("STOP");
        btStop.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD, 25));
        btStop.setBounds(140, 20, 100, 20);//x axis, y axis, width, height 

        //p1.add(cmbox);
        p1.add(rb1);
        p1.add(rb2);
        p1.add(btPlay);
        p1.add(btStop);
        p1.setBorder(BorderFactory.createLineBorder(Color.black));

        JPanel p2 = new JPanel();
        p2.setBackground(Color.PINK);
        p2.setBorder(BorderFactory.createLineBorder(Color.red));

        JComboBox cmbox = new JComboBox();  //The JComboBox to be added to a JPanel
        cmbox.setFont(new Font("新細明體", Font.PLAIN, 20));
        cmbox.addItem("紫竹調");
        cmbox.addItem("走一同去郊遊");
        cmbox.addItem("大野狼");
        cmbox.addItem("歸來吧蘇連多");
        cmbox.addItem("追尋");
        cmbox.addItem("三輪車");
        cmbox.addItem("我家門前有小河");
        cmbox.addItem("漁家樂");
        cmbox.addItem("嚕啦啦");
        cmbox.addItem("踏雪尋梅");

        p2.add(cmbox);

        frame.add(p1, BorderLayout.PAGE_START);
        frame.add(p2, BorderLayout.CENTER);
    }
}

1 Ответ

0 голосов
/ 06 ноября 2019

Реализация изменений, описанных ниже в коде, решает проблему.

enter image description here

import java.awt.*;
import javax.swing.*;

public class TestCombo {

    public static void main(String[] args) {
        JFrame frame = new JFrame("康樂彩歌");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel p1 = new JPanel();
        p1.setBackground(Color.CYAN);

        JRadioButton rb1 = new JRadioButton("加簡譜", false);
        rb1.setFont(new Font("新細明體", Font.PLAIN, 20));

        JRadioButton rb2 = new JRadioButton("加人聲", false);
        rb2.setFont(new Font("新細明體", Font.PLAIN, 20));

        JButton btPlay = new JButton("PLAY");
        btPlay.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD, 25));

        JButton btStop = new JButton("STOP");
        btStop.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD, 25));

        p1.add(rb1);
        p1.add(rb2);
        p1.add(btPlay);
        p1.add(btStop);
        p1.setBorder(BorderFactory.createLineBorder(Color.black));

        JPanel p2 = new JPanel();
        p2.setBackground(Color.PINK);
        p2.setBorder(BorderFactory.createLineBorder(Color.red));

        JComboBox cmbox = new JComboBox();  //The JComboBox to be added to a JPanel
        cmbox.setFont(new Font("新細明體", Font.PLAIN, 20));
        cmbox.addItem("紫竹調");
        cmbox.addItem("走一同去郊遊");
        cmbox.addItem("大野狼");
        cmbox.addItem("歸來吧蘇連多");
        cmbox.addItem("追尋");
        cmbox.addItem("三輪車");
        cmbox.addItem("我家門前有小河");
        cmbox.addItem("漁家樂");
        cmbox.addItem("嚕啦啦");
        cmbox.addItem("踏雪尋梅");

        p2.add(cmbox);

        frame.add(p1, BorderLayout.PAGE_START);
        frame.add(p2, BorderLayout.CENTER);

        frame.pack();
        frame.setVisible(true);
    }
}
  1. btPlay.setBounds(100, 20, 100, 20); Не устанавливайте границы компонентов. Пусть макеты (отступы и границы) делают свое дело.
  2. frame.setBounds(0, 0, 1368, 500); Это всего лишь предположение, и если это правильное предположение для одной ОС, оно будет неверным для других. Вместо pack() окно после добавления компонентов.
  3. Боковая панель: GUI должен быть запущен на EDT. (Не реализовано выше: «батареи не включены».)
...