使用Java1.6中的Swing库构建简单的GUI
我正在尝试使用Swing库构建一个简单的GUI。我不明白为什么我的表会删除以前添加到GUI中的所有内容,然后才创建表。我假设它是addMainPanel中的某个命令,但我不确定是哪个命令。如蒙指教,不胜感激使用Java1.6中的Swing库构建简单的GUI,java,swing,layout,Java,Swing,Layout,我正在尝试使用Swing库构建一个简单的GUI。我不明白为什么我的表会删除以前添加到GUI中的所有内容,然后才创建表。我假设它是addMainPanel中的某个命令,但我不确定是哪个命令。如蒙指教,不胜感激 package fuelConsumption; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayo
package fuelConsumption;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class LogView implements ActionListener {
private Log myLog;
private JFrame frame;
public LogView (String frameName) {
this.frame = new JFrame(frameName);
this.frame.setPreferredSize(new Dimension(500,500));
this.frame.getContentPane().setLayout(new BorderLayout());
this.addMainPanel(frame);
this.addTable(frame);
//addMenu(frame);
//addToolBar(frame);
this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.frame.pack();
this.frame.setVisible(true);
}
private void addTable(JFrame frame2) {
String[] columnNames = {"date",
"station",
"fuel grade",
"fuel amount",
"fuel unit cost",
"fuel cost",
"trip distance"};
Object[][] data = {
{"Shell", 89, 40, 109.5, "bla", 100, 123}
};
JTable table = new JTable(data, columnNames);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
//table.setFillsViewportHeight(true);
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
//Add the scroll pane to this panel.
//this.frame.setContentPane(scrollPane);
frame2.getContentPane().add(scrollPane);
}
private void addMainPanel(JFrame frame2) {
// TODO Auto-generated method stub
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 5;
c.ipady = 50;
c.anchor = GridBagConstraints.LINE_START;
c.weightx = 0.5;
c.weighty = 0.5;
JLabel label = new JLabel("");
panel.add(label,c);
label = new JLabel("Info");
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 1;
c.anchor = GridBagConstraints.LINE_START;
c.weightx = 0.5;
c.weighty = 0.5;
panel.add(label,c);
label = new JLabel("Label");
c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 1;
c.anchor = GridBagConstraints.LINE_START;
c.weightx = 0.5;
c.weighty = 0.5;
panel.add(label,c);
label = new JLabel("Comments");
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 2;
c.anchor = GridBagConstraints.FIRST_LINE_START;
c.weightx = 0.5;
c.weighty = 0.5;
panel.add(label,c);
JTextArea textArea = new JTextArea(4,30);
JScrollPane textScroll = new JScrollPane(textArea);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 2;
c.gridwidth = 4;
c.ipadx = 30;
c.ipady = 50;
c.anchor = GridBagConstraints.FIRST_LINE_START;
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.weighty = 0.5;
panel.add(textScroll,c);
JButton button = new JButton("Edit");
button.addActionListener(this);
button.setActionCommand("Edit");
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 3;
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.weighty = 0.5;
panel.add(button,c);
button = new JButton("Previous");
button.addActionListener(this);
button.setActionCommand("Previous");
c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 3;
c.weightx = 0.5;
c.weighty = 0.5;
panel.add(button,c);
button = new JButton("Next");
button.addActionListener(this);
button.setActionCommand("Next");
c = new GridBagConstraints();
c.gridx = 3;
c.gridy = 3;
// c.weightx = 0.5;
// c.weighty = 0.5;
panel.add(button,c);
frame2.getContentPane().add(panel);
}
public static void main(String [] args){
new LogView("Fuel Consumption");
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
JFrame
的默认布局是,因此在addTable
和addMainPanel
方法中分别需要类似的内容:
frame2.add(scrollPane, BorderLayout.CENTER);
frame2.add(panel, BorderLayout.SOUTH);
请注意,getContentPane()
不是必需的。您的GUI可以是:
如果你改变
private void addTable(JFrame frame2){
toprivate void addTable(){
及
frame2.getContentPane().add(滚动窗格);
到frame.add(滚动窗格,BorderLayout.CENTER);
致:
private void addMainPanel(JFrame frame2){
toprivate void addMainPanel(){
及
frame2.getContentPane().add(面板);
到frame.add(面板,BorderLayout.SOUTH);
因为在中只有一个可以放置在其中一个区域中,因为没有BorderLayout常量的定义,所以JComponent将放置在BorderLayout.CENTER
区域中
(三)
那你得换衣服了
this.addMainPanel(frame);
this.addTable(frame);
到
您正在混合布局、组件 如果要将面板和表格作为两个单独的组件(而不是面板内的表格)添加到框架中,应注意框架的布局,
BorderLayout
。应使用布局指示将面板和表格添加到框架中以放置组件,如:
frame2.getContentPane().add(scrollPane, BorderLayout.SOUTH);
及
+1正如您所观察到的,更常见的情况是容器层次结构符合词法范围,例如,返回面板而不是传递容器。
frame2.getContentPane().add(scrollPane, BorderLayout.SOUTH);
frame2.getContentPane().add(panel, BorderLayout.NORTH);