JFrame和JPanel分离的问题?

时间:2011-09-29 08:10:39

标签: java jframe jpanel jbutton boxlayout

我不能告诉我如果我不知道这两件事是什么,而是从我收集到的东西,JFrame只是一个大开盒子,所以我想要做的就是打开那个大盒子可以说是Red,然后我制作了一个JPanel,我认为它是JFRAME的顶部,我试图让它变成灰色,所以我怎么能得到一个红框,左边是灰色条带。我也尝试将这些按钮垂直放在灰色的JPanel上,如果可能的话,它们都要拉伸到JPanel的宽度。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;


public class Board extends JFrame implements MouseListener,ActionListener
{
    public int x1, y1, x2, y2;

    public Board()
{
    JFrame frame = new JFrame();
    frame.setSize(1200, 800);
    Container con = frame.getContentPane();
    con.setBackground(Color.RED);
    addMouseListener(this);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    JButton clear = new JButton("Clear");
    clear.addActionListener(this); 
    JButton emptyR = new JButton("Empty Rectangle");
    emptyR.addActionListener(this);

    JPanel menu = new JPanel();
    menu.setSize(200, 500);
    BoxLayout layout = new BoxLayout(menu, BoxLayout.Y_AXIS);
    menu.setLayout(layout);
    menu.add(clear);
    menu.add(emptyR);
    //menu.setBackground(Color.black);
    frame.add(menu);


    JMenuBar menuBar = new JMenuBar();
    frame.setJMenuBar(menuBar);
    JMenu help = new JMenu("Help");
    menuBar.add(help);
    JMenuItem about = new JMenuItem("About");
    help.add(about);
    about.addActionListener(this);
}

    public void mouseExited(MouseEvent evt){}
    public void mouseEntered(MouseEvent evt){}
    public void mouseClicked(MouseEvent evt){}
    public void mousePressed(MouseEvent evt)
{
        x1 = evt.getX();
        y1= evt.getY();
}
    public void mouseReleased(MouseEvent evt)
{
        x2 =evt.getX();
        y2=evt.getY();
}

    public void actionPerformed(ActionEvent e) 
{


}
}

1 个答案:

答案 0 :(得分:2)

初看起来,只要扩展JFrame,就会自动生成JFrame。 Board 是一个JFrame,框架不是必需的。研究tutorial,尤其是Swing部分。

public class Board extends JFrame implements MouseListener,ActionListener {
    public int x1, y1, x2, y2;

    public Board() {
    JFrame frame = new JFrame();
    frame.setSize(1200, 800);
    Container con = frame.getContentPane();
    con.setBackground(Color.RED);
    addMouseListener(this);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ...

应该是:

public class Board extends JFrame implements MouseListener,ActionListener {
    public int x1, y1, x2, y2;

    public Board() {
       setSize(1200, 800);
       Container con = getContentPane();
       con.setBackground(Color.RED);
       addMouseListener(this);
       setVisible(true);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       ...

以下是NetBeans新增的通用JSplitPane方法:

public class NewJFrame1 extends javax.swing.JFrame {

    /** Creates new form NewJFrame1 */
    public NewJFrame1() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jSplitPane1 = new javax.swing.JSplitPane();
        jPanel1 = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jSplitPane1.setBorder(null);
        jSplitPane1.setDividerLocation(100);
        jSplitPane1.setDividerSize(1);
        jSplitPane1.setEnabled(false);

        jPanel1.setBackground(new java.awt.Color(153, 153, 153));

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        jSplitPane1.setLeftComponent(jPanel1);

        jPanel2.setBackground(new java.awt.Color(255, 0, 0));

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 299, Short.MAX_VALUE)
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        jSplitPane1.setRightComponent(jPanel2);

        getContentPane().add(jSplitPane1, java.awt.BorderLayout.CENTER);

        pack();
    }// </editor-fold>

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new NewJFrame1().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JSplitPane jSplitPane1;
    // End of variables declaration
}

您应该将setDividerLocation(n)配置为JFrame宽度的1/3。 jSplitPane1.setEnabled(false)使分区固定。