2013-05-22 5 views
2

old Я приложил свой код ниже, снимок экрана моей программы и рисунок того, на что я хочу, чтобы вкладка выглядела. Мне нужно, чтобы моя JPanel textPanel появилась под JButtons на вкладке LLP. Я попытался добавить textPanel в tabsPanel, но когда я сделаю это, мои вкладки исчезнут. Мне нужно, чтобы textPanel растягивалась по экрану и заполняла пробел ниже вкладки LLP. Но я также не хочу, чтобы textPanel отображалась на других вкладках. Первое показанное изображение - это то, как выглядела старая программа. Меня попросили начать с нуля и сделать лучшую программу. Я не могу получить входной выходной журнал на моем экране. Но, как вы видите, оно отображает то, что я выбрал в настройках порта. Screen Shot of ProgramDrawingДобавление JPanel в JPanel

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.TextArea; 

import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JFrame; 
import javax.swing.JRadioButton; 
import javax.swing.JTabbedPane; 


public class TestApplication implements ActionListener { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setSize(1000, 1000); 
     frame.setTitle("RBA Test Application"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     JLabel logLabel = new JLabel("Input/Output Log"); 

     JButton initialize = new JButton("Initialize"); 
     JButton connect = new JButton("Connect"); 
     JButton disconnect = new JButton("Disconnect"); 
     JButton shutdown = new JButton("Shut Down"); 
     JButton portsettings = new JButton("Port Settings"); 
     JButton online = new JButton("Go Online"); 
     JButton offline = new JButton("Go Offline"); 
     JButton status = new JButton("Status"); 
     JButton reboot = new JButton("Reboot"); 
     JButton account = new JButton("Account"); 
     JButton amount = new JButton("Amount"); 
     JButton reset = new JButton("Reset"); 
     JButton apprvordecl = new JButton("Apprv/Decl"); 
     JButton test = new JButton("Test Button #1"); 
     JButton testing = new JButton("Test Button #2"); 
     JRadioButton button = new JRadioButton("Radio Button"); 
     JRadioButton button2 = new JRadioButton("Radio Button"); 
     JCheckBox checkbox = new JCheckBox("Check Box"); 
     JCheckBox checkbox2 = new JCheckBox("Check Box"); 

     JPanel testPanel = new JPanel(); 
     testPanel.add(button); 
     testPanel.add(button2); 
     testPanel.add(checkbox2); 

    JPanel posPanel = new JPanel(); 
    posPanel.add(test); 
    posPanel.add(testing); 
    posPanel.add(checkbox); 

    JPanel llpPanel = new JPanel(); 
    llpPanel.add(online); 
    llpPanel.add(offline); 
    llpPanel.add(status); 
    llpPanel.add(reboot); 
    llpPanel.add(account); 
    llpPanel.add(amount); 
    llpPanel.add(reset); 
    llpPanel.add(apprvordecl); 

    JPanel textPanel = new JPanel(new BorderLayout()); 
    textPanel.add(logLabel); 
    frame.add(logLabel); 

    JPanel buttonPanel = new JPanel(); 
    buttonPanel.add(initialize); 
    buttonPanel.add(connect); 
    buttonPanel.add(disconnect); 
    buttonPanel.add(shutdown); 
    buttonPanel.add(portsettings); 
    frame.add(buttonPanel); 
    frame.add(buttonPanel, BorderLayout.NORTH); 

    JTabbedPane tabbedPane = new JTabbedPane(); 
    tabbedPane.addTab("LLP", null, llpPanel, "Low Level Protocol"); 
    tabbedPane.addTab("POS",null, posPanel, "Point Of Sale"); 
    tabbedPane.addTab("Test", null, testPanel, "Test"); 

    JPanel tabsPanel = new JPanel(new BorderLayout()); 
    tabsPanel.add(tabbedPane); 
    frame.add(tabsPanel, BorderLayout.CENTER); 


    frame.pack(); 



} 

@Override 
public void actionPerformed(ActionEvent arg0) { 
    // TODO Auto-generated method stub 

} 






} 
+0

Не удалось удалить весь код, напрямую связанный с проблемой макета. Весь материал 'ActionListener' бесполезен и делает код трудным для чтения.Пожалуйста, укажите только код, необходимый для решения этой проблемы. – thatidiotguy

+0

ok Я изменил его. Все мои панели не выстраиваются в линию, как раньше, поэтому я сожалею, если это кажется запутанным. –

+0

Я думаю, что ваш llpPanel нуждается в макете, а также для того, чтобы выполнить то, что вы хотите. Затем добавьте кнопки в BorderLayout.NORTH и добавьте текстовую панель в BorderLayout.CENTER –

ответ

0

Вам нужна другая вложенную панель, попробуйте следующее:

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 


public class TestApplication implements ActionListener { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
    frame.setSize(1000, 1000); 
    frame.setTitle("RBA Test Application"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

    JLabel logLabel = new JLabel("Input/Output Log"); 

    JButton initialize = new JButton("Initialize"); 
    JButton connect = new JButton("Connect"); 
    JButton disconnect = new JButton("Disconnect"); 
    JButton shutdown = new JButton("Shut Down"); 
    JButton portsettings = new JButton("Port Settings"); 
    JButton online = new JButton("Go Online"); 
    JButton offline = new JButton("Go Offline"); 
    JButton status = new JButton("Status"); 
    JButton reboot = new JButton("Reboot"); 
    JButton account = new JButton("Account"); 
    JButton amount = new JButton("Amount"); 
    JButton reset = new JButton("Reset"); 
    JButton apprvordecl = new JButton("Apprv/Decl"); 
    JButton test = new JButton("Test Button #1"); 
    JButton testing = new JButton("Test Button #2"); 
    JRadioButton button = new JRadioButton("Radio Button"); 
    JRadioButton button2 = new JRadioButton("Radio Button"); 
    JCheckBox checkbox = new JCheckBox("Check Box"); 
    JCheckBox checkbox2 = new JCheckBox("Check Box"); 

    JPanel testPanel = new JPanel(); 
    testPanel.add(button); 
    testPanel.add(button2); 
    testPanel.add(checkbox2); 

JPanel posPanel = new JPanel(); 
posPanel.add(test); 
posPanel.add(testing); 
posPanel.add(checkbox); 

//CHANGED PART 
JPanel llpPanel = new JPanel(new BorderLayout()); 
JPanel llpbuttonPanel = new JPanel(); 
llpbuttonPanel.add(online); 
llpbuttonPanel.add(offline); 
llpbuttonPanel.add(status); 
llpbuttonPanel.add(reboot); 
llpbuttonPanel.add(account); 
llpbuttonPanel.add(amount); 
llpbuttonPanel.add(reset); 
llpbuttonPanel.add(apprvordecl); 
llpPanel.add(llpbuttonPanel, BorderLayout.NORTH); 

JPanel textPanel = new JPanel(new BorderLayout()); 
textPanel.add(logLabel); 
llpPanel.add(textPanel, BorderLayout.CENTER); 
//END CHANGED PART 

JPanel buttonPanel = new JPanel(); 
buttonPanel.add(initialize); 
buttonPanel.add(connect); 
buttonPanel.add(disconnect); 
buttonPanel.add(shutdown); 
buttonPanel.add(portsettings); 
frame.add(buttonPanel); 
frame.add(buttonPanel, BorderLayout.NORTH); 

JTabbedPane tabbedPane = new JTabbedPane(); 
tabbedPane.addTab("LLP", null, llpPanel, "Low Level Protocol"); 
tabbedPane.addTab("POS",null, posPanel, "Point Of Sale"); 
tabbedPane.addTab("Test", null, testPanel, "Test"); 

JPanel tabsPanel = new JPanel(new BorderLayout()); 
tabsPanel.add(tabbedPane); 
frame.add(tabsPanel, BorderLayout.CENTER); 


frame.pack(); 



} 

@Override 
public void actionPerformed(ActionEvent arg0) { 
    // TODO Auto-generated method stub 

} 






} 

Чтобы поместить в правильной области текста: (вы хотите создать и ссылку на текстовую области по-другому)

//BEGIN CHANGE 
JPanel llpPanel = new JPanel(new BorderLayout()); 
JPanel llpbuttonPanel = new JPanel(); 
llpbuttonPanel.add(online); 
llpbuttonPanel.add(offline); 
llpbuttonPanel.add(status); 
llpbuttonPanel.add(reboot); 
llpbuttonPanel.add(account); 
llpbuttonPanel.add(amount); 
llpbuttonPanel.add(reset); 
llpbuttonPanel.add(apprvordecl); 
llpPanel.add(llpbuttonPanel, BorderLayout.NORTH); 

JPanel textPanel = new JPanel(new BorderLayout()); 
textPanel.add(logLabel, BorderLayout.NORTH); 

JTextArea area = new JTextArea(); 
textPanel.add(area, BorderLayout.CENTER); 
llpPanel.add(textPanel, BorderLayout.CENTER); 

//END CHANGE 
+0

Это тоже не сработало. Он помещает слова «Журнал ввода/вывода» в левую сторону в центре. Мне нужны слова в центре экрана с областью под ним, которая будет отслеживать все действия, выполняемые во время работы программы. Например, если вы нажмете «connect» и программа подключится к интернет-соединению, я хочу, чтобы текстовая область отображалась «Подключена к (независимо от интернет-соединения)». –

+0

. Вы просите простое решение всей проблемы интерфейса, но нет, я просто попытался решить главный для вас. Если вы хотите, чтобы ваш текст был посередине, вам может понадобиться еще одна вложенная панель, другой макет и другие компоненты качания. Я советую вам прочитать на качелях и макетах, например mschenk74, так как ответ на ваш следующий вопрос оставит вас только с другим. Удачи. –

+0

Кроме того, вам не нужен JLabel для текста на панели, вам нужен JTextArea :). –

3

Взлом с графическим интерфейсом Swing не работает очень хорошо. Мое предложение - пройти через Oracle Swing Tutorial и изучить некоторые концепции, которые вы можете собрать во время взлома. Знание компонентов Swing, доступных для вас, и знание менеджеров макетов Swing. Особенно зная руководства по планированию Swing.

Вот GUI, который я создал.

RBM Test Application

Графический интерфейс является более сложным, чем это кажется на первый взгляд. В JPanels было много JPanels. Я использовал несколько FLowLayouts, пару BoxLayouts и GridBagLayout.

Вот диаграмма дерева основных JPanels, составляющих этот графический интерфейс.

Main JFrame 
    Main JPanel 
     Communication JPanel 
      First Button Row JPanel 
      Second Button Row JPanel 
     JTabbedPane 
      LLP Tab JPanel 
       Log JPanel 

У вас всегда должен быть один основной JPanel для хранения всех ваших других компонентов.

Это одна из вещей, которые происходят из опыта с Swing. Вы начинаете видеть прямоугольники, которые составляют различные части графического интерфейса.

Обычно я не кодирую этот сложный графический интерфейс в одном классе. Я сделал это на этот раз, чтобы у меня было SSCCE, чтобы опубликовать это объяснение.

Изучите код, чтобы увидеть, как различные компоненты JPanels и Swing подходят друг к другу.

import java.awt.Component; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTabbedPane; 
import javax.swing.JTextPane; 
import javax.swing.SwingUtilities; 
import javax.swing.border.Border; 

public class RBMTestApplication implements Runnable { 

    private static final Insets SPACE_INSETS = new Insets(10, 10, 4, 10); 

    private JFrame    frame; 

    private JPanel    mainPanel; 
    private JPanel    communicationPanel; 
    private JPanel    cPanel1; 
    private JPanel    cPanel2; 
    private JPanel    llpPanel; 

    private JTabbedPane   tabbedPane; 

    @Override 
    public void run() { 
     createFrame(); 
    } 

    private void createFrame() { 
     frame = new JFrame(); 
     frame.setTitle("RBM Test Application"); 
     frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
     frame.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent event) { 
       exitProcedure(); 
      } 
     }); 
     createMainPanel(); 
     frame.add(mainPanel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public void exitProcedure() { 
     frame.dispose(); 
     System.exit(0); 
    } 

    private void createMainPanel() { 
     mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 
     createCommunicationPanel(); 
     mainPanel.add(communicationPanel); 
     createTabbedPane(); 
     mainPanel.add(tabbedPane); 
    } 

    private void createCommunicationPanel() { 
     communicationPanel = new JPanel(); 
     Border border = BorderFactory.createTitledBorder("Communication"); 
     communicationPanel.setBorder(border); 
     communicationPanel.setLayout(new BoxLayout(communicationPanel, 
       BoxLayout.Y_AXIS)); 

     cPanel1 = new JPanel(); 

     JButton initializeButton = new JButton("Initialize"); 
     cPanel1.add(initializeButton); 

     JButton connectButton = new JButton("Connect"); 
     cPanel1.add(connectButton); 

     JButton disconnectButton = new JButton("Disconnect"); 
     cPanel1.add(disconnectButton); 

     JButton shutdownButton = new JButton("Shutdown"); 
     cPanel1.add(shutdownButton); 

     communicationPanel.add(cPanel1); 

     cPanel2 = new JPanel(); 

     JButton portSettingsButton = new JButton("Port Settings"); 
     portSettingsButton.setHorizontalAlignment(JButton.CENTER); 
     cPanel2.add(portSettingsButton); 

     communicationPanel.add(cPanel2); 
    } 

    private void createTabbedPane() { 
     tabbedPane = new JTabbedPane(); 
     createLLPPanel(); 
     tabbedPane.addTab("LLP", llpPanel); 
     // tabbedPane.addTab("POS", posPanel); 
     // tabbedPane.addTab("Tere", terePanel); 
    } 

    private void createLLPPanel() { 
     llpPanel = new JPanel(); 
     llpPanel.setLayout(new GridBagLayout()); 

     int gridy = 0; 

     JButton goOnlineButton = new JButton("Go online"); 
     addComponent(llpPanel, goOnlineButton, 0, gridy, 1, 1, SPACE_INSETS, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     JButton statusButton = new JButton("Status"); 
     addComponent(llpPanel, statusButton, 1, gridy, 1, 1, SPACE_INSETS, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     JButton pccountButton = new JButton("PC count"); 
     addComponent(llpPanel, pccountButton, 2, gridy, 1, 1, SPACE_INSETS, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     JButton resetButton = new JButton("Reset"); 
     addComponent(llpPanel, resetButton, 3, gridy++, 1, 1, SPACE_INSETS, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     JButton goOfflineButton = new JButton("Go offline"); 
     addComponent(llpPanel, goOfflineButton, 0, gridy, 1, 1, SPACE_INSETS, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     JButton rebootButton = new JButton("Reboot"); 
     addComponent(llpPanel, rebootButton, 1, gridy, 1, 1, SPACE_INSETS, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     JButton amountButton = new JButton("Amount"); 
     addComponent(llpPanel, amountButton, 2, gridy, 1, 1, SPACE_INSETS, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     JButton approveButton = new JButton("Approve/Decline"); 
     addComponent(llpPanel, approveButton, 3, gridy++, 1, 1, SPACE_INSETS, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 

     JPanel logPanel = new JPanel(); 
     Border border = BorderFactory.createTitledBorder("Input/output log"); 
     logPanel.setBorder(border); 

     JTextPane textPane = new JTextPane(); 
     textPane.setEditable(false); 

     JScrollPane scrollPane = new JScrollPane(textPane); 
     scrollPane.getViewport().setPreferredSize(new Dimension(400, 150)); 

     logPanel.add(scrollPane); 

     addComponent(llpPanel, logPanel, 0, gridy++, 4, 1, SPACE_INSETS, 
       GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL); 
    } 

    private void addComponent(Container container, Component component, 
      int gridx, int gridy, int gridwidth, int gridheight, Insets insets, 
      int anchor, int fill) { 
     GridBagConstraints gbc = new GridBagConstraints(gridx, gridy, 
       gridwidth, gridheight, 1.0D, 1.0D, anchor, fill, insets, 0, 0); 
     container.add(component, gbc); 
    } 

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

} 

Вы должны всегда запуска приложения Swing, с помощью вызова метода SwingUtilities invokeLater. Это гарантирует, что компоненты Swing будут созданы и обновлены в потоке Dispatch.

+0

Я не использовал построитель графического интерфейса. Я сделал все это сам. Я начинающий программист, работающий в компании в качестве стажера, чтобы получить некоторый опыт. Я никогда не занимался классом на java. Я пытаюсь научить себя книгам и онлайн-учебникам –