Java Swing JTabbedPane макет - PullRequest
       1

Java Swing JTabbedPane макет

0 голосов
/ 31 октября 2018

Я новичок в Swing и не могу найти страницу, которая помогает мне понять JTabbedPane. Я не могу найти способ управления расположением компонентов панелей с вкладками. Я могу правильно расположить каждую из своих панелей в виде отдельных графических интерфейсов, но не в виде вкладок, как мне нужно. Я хотел бы использовать BorderLayout, а не FlowLayout.

Кроме того, вы можете видеть, что я пытаюсь использовать цвета для отслеживания моих панелей и их компонентов. Я не могу установить фон JTabbedPane. Это по-прежнему серый по умолчанию. Может кто-нибудь сказать мне, почему это?

Спасибо за любой совет, который вы можете дать.

То, что я имею до сих пор, похоже, следует «макету потока», несмотря на любые изменения, которые я пробовал

(Методы были удалены или почти удалены, чтобы сделать код короче)

открытый класс GUIFrame расширяет JFrame {

public GUIFrame(String title) {
    JFrame frame = new JFrame(title);
    Container c = frame.getContentPane();
    buildGUI(c);
    setFrameAttributes(frame);
}
private void buildGUI(Container c) {
    c.setLayout(new BorderLayout());
    c.setBackground(Color.BLACK);
    JTabbedPane tabs = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.WRAP_TAB_LAYOUT);
    tabs.setBackground(Color.YELLOW);
    c.add("Center", tabs);
    tabs.addTab("Specialty", new SpecialtyPanel());
    tabs.addTab("Treatment", new TreatmentPanel());
    tabs.addTab("Doctor", new DoctorPanel());
    tabs.addTab("Patient", new PatientPanel());
}
private void setFrameAttributes(JFrame f) {
    f.setSize(500, 500);
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String args[]) {
    MedicalSystemIO test = new MedicalSystemIO();
    new GUIFrame("Tabbed Title");
}

открытый класс SpecialtyPanel расширяет JPanel, реализует ActionListener {

JTextField jteInput = null; 
DefaultListModel<String> model = new DefaultListModel<String>();
JList<String> list = new JList(model);
JScrollPane pane = new JScrollPane(list);

public SpecialtyPanel() {
    JPanel panel = new JPanel();
    panel.setBorder(BorderFactory.createLineBorder(Color.black));
    buildGUI(panel);    
}
private void buildGUI(JPanel panel) {       
    JPanel jpaInput = createInputPanel();
    JPanel jpaProcess = createProcessPanel();
    JPanel jpaOutput = createOutputPanel();
    //panel.setLayout(new BorderLayout());
    add("North", jpaInput);
    add("Center", jpaProcess);
    add("South", jpaOutput);
}
private JPanel createInputPanel() {
    JPanel jpaInput = new JPanel();
    jpaInput.setBackground(Color.RED);
    return jpaInput;
}
private JPanel createProcessPanel() {
    JPanel jpaProcess = new JPanel();
    jpaProcess.setBackground(Color.BLUE);
    return jpaProcess;
}
private JPanel createOutputPanel() {
    JPanel jpaOutput = new JPanel();
    jpaOutput.add(pane);
    return jpaOutput;
}

1 Ответ

0 голосов
/ 31 октября 2018

Путь SpecialtyPanel показан таким образом (схема потока), когда вы неправильно размещаете на нем компоненты:

  1. Нет необходимости передавать новую панель в метод buildGUI, поскольку вы хотите поместить их непосредственно в SpecialtyPanel, который уже является JPanel,
  2. Вы прокомментировали настройки BorderLayout и
  3. вы использовали неправильное обозначение для передачи ограничений макета в add методах.

Ваш конструктор и метод сборки должны выглядеть следующим образом:

public SpecialtyPanel() {
    buildGUI();
}

private void buildGUI() {
    setBorder(BorderFactory.createLineBorder(Color.black));
    JPanel jpaInput = createInputPanel();
    JPanel jpaProcess = createProcessPanel();
    JPanel jpaOutput = createOutputPanel();
    setLayout(new BorderLayout());
    add(jpaInput, BorderLayout.NORTH);
    add(jpaProcess, BorderLayout.CENTER);
    add(jpaOutput, BorderLayout.SOUTH);
}

Чтобы панель имела цвет, отличный от серого, необходимо покрасить компонент, помещенный на панель с вкладками, так как он покрывает все пространство. Добавьте нужный цвет к методу buildGUI, например ::1010 *

private void buildGUI(JPanel panel) {
    // ...
    setBackground(Color.YELLOW);
}

Поскольку JPanel по умолчанию непрозрачен (что означает непрозрачный), вам нужно установить панели сверху (кроме тех, которые вы явно закрасили), чтобы они были прозрачными. В случае SpecialtyPanel:

private JPanel createOutputPanel() {
    JPanel jpaOutput = new JPanel();
    jpaOutput.add(pane);
    jpaOutput.setOpaque(false); // panel transparent
    return jpaOutput;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...