Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java1.6中的Swing库构建简单的GUI_Java_Swing_Layout - Fatal编程技术网

使用Java1.6中的Swing库构建简单的GUI

使用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

我正在尝试使用Swing库构建一个简单的GUI。我不明白为什么我的表会删除以前添加到GUI中的所有内容,然后才创建表。我假设它是addMainPanel中的某个命令,但我不确定是哪个命令。如蒙指教,不胜感激

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){
to
private void addTable(){

frame2.getContentPane().add(滚动窗格);
frame.add(滚动窗格,BorderLayout.CENTER);

致:

private void addMainPanel(JFrame frame2){
to
private 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);