清理嵌套的J面板

时间:2013-05-21 23:02:07

标签: java swing layout jpanel layout-manager

为你们重建SCCE。

我的目标是这样的 target layout1 target layout2

一般的想法是点击菜单的标题栏(右侧)将可折叠(设置为可见为false)与其关联的内容窗格:
gender_panel_BG折叠gender_panel_body
race_panel_BG崩溃了race_panel_body
class_panel_BG折叠class_panel_body
base_stats_panel_BG折叠base_stats_panel_body
merits_panel_BG折叠merits_panel_body

你明白了

另一件困扰我的事情是身体顶部的巨大空间和它的内容。


Gradient bar img source title gradient source

后台源来源bg source

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.*;

public class JaGCharCreation  {

    //set inital size of window
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    int initalWidth = (int) screenSize.width - 50;
    int initalHeight = (int) screenSize.height - 50;
    JPanel gender_panel_body;
    GridBagConstraints gbc;
    JLabel viewdata_gender = new JLabel("gender");
    ImageIcon BGicon = new ImageIcon("parchmentTall.jpg");
    Image img1 = BGicon.getImage();

    public static void main(String[] args) {
        new JaGCharCreation ();
    }

    //set up thread safe invoking for GUI
    public JaGCharCreation () {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                //frame.setLocationRelativeTo(null);
                frame.setVisible(true);
                // Give the frame an initial size.
                frame.setSize(initalWidth, initalHeight);
            }
        });
    }

    //main panel to hold all others
    public class TestPane extends JPanel {
        public TestPane() {
            setLayout(new GridLayout(0, 2));
            add(createLeftPane());
            add(createRightPane());
        }//end of class for master frame

/////////////////////////////////Left Panel Nest Begin//////////////////////////////////////////////////////////////
        protected JPanel createLeftPane() {
        img1 = img1.getScaledInstance(initalWidth/2, initalHeight, java.awt.Image.SCALE_SMOOTH);
        final ImageIcon BGiconSM = new ImageIcon(img1);

            JPanel panel = new JPanel(new BorderLayout())                           {
                            protected void paintComponent(Graphics g)
                                {
                                //  Dispaly image at full size
                                g.drawImage(BGiconSM.getImage(), 0, 0, null);
                                super.paintComponent(g);
                                }
                            };
            panel.setOpaque( false );
            panel.setBorder(new EmptyBorder(35, 80, 35, 80));
            //panel.setBackground(Color.RED);
            return  panel;
        }//end left pane
/////////////////////////////////Left Panel Nest End//////////////////////////////////////////////////////////////
/////////////////////////////////Right Panel Nest Begin//////////////////////////////////////////////////////////////
        protected JPanel createRightPane() {
            img1 = img1.getScaledInstance(initalWidth/2, initalHeight, java.awt.Image.SCALE_SMOOTH);
            final ImageIcon BGiconSM = new ImageIcon(img1);
            JPanel content = new JPanel(new GridBagLayout());
            content.setOpaque(false);

            JPanel panel = new JPanel(new BorderLayout())                           {
                            protected void paintComponent(Graphics g)
                                {
                                //  Dispaly image at full size
                                g.drawImage(BGiconSM.getImage(), 0, 0, null);
                                super.paintComponent(g);
                                }
                            };
            panel.setOpaque( false );
            panel.setBorder(new EmptyBorder(35, 80, 35, 80));
            //panel.setBackground(Color.BLUE);

            //set up our image for the title bars
            ImageIcon icon = new ImageIcon("GradientDetail.png");
            Image img = icon.getImage();
            img = img.getScaledInstance(initalWidth/2, 40, java.awt.Image.SCALE_SMOOTH);
            final ImageIcon iconSM = new ImageIcon(img);

/////////////////////////////////Gender Panel Nest Begins//////////////////////////////////////////////////////////////
            JPanel gender_panel_BG = new JPanel(new BorderLayout())
                {
                protected void paintComponent(Graphics g)
                    {
                    //  Dispaly image at full size
                    g.drawImage(iconSM.getImage(), 0, 0, null);
                    super.paintComponent(g);
                    }
                };
            gender_panel_BG.setOpaque( false );

            JLabel gender_panel_label = new JLabel("Gender");
            gender_panel_label.setFont(new Font("Impact", Font.BOLD, 30));
            gender_panel_label.setForeground(Color.white);
            gender_panel_label.setOpaque(false);

            gender_panel_body = new JPanel(new GridLayout(1, 3));
            gender_panel_body.setBackground(Color.WHITE);

            gender_panel_BG.add(gender_panel_label, BorderLayout.NORTH);

            JPanel gender_panel = new JPanel(new GridLayout(2, 1));
            //gender_panel.setBorder(new EmptyBorder(0, 10, 0, 10));
            //gender_panel.setBackground(Color.GREEN);
            gender_panel.setOpaque(false);
            gender_panel.add(gender_panel_BG);
            gender_panel.add(gender_panel_body);

            MouseAdapter gender = new MouseAdapterMod(){
           public void mousePressed(MouseEvent e) {
                   //System.out.println(e.getSource());
                   System.out.println("A mouse was pressed");
                gender_panel_body.setVisible(!gender_panel_body.isVisible());
           }//end of mousePressed(MouseEvent e)
        };

        // Create radio buttons and add them to content pane.
        JRadioButton g1 = new JRadioButton("Male");
        g1.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                    viewdata_gender.setText("Gender: Male");
                 }//action perfomed;
            });//g1 add action listener
        gender_panel_body.add(g1);

        JRadioButton g2 = new JRadioButton("Female");
        g2.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                    viewdata_gender.setText("Gender: Female");
                 }//action perfomed;
            });//g2 add action listener
        gender_panel_body.add(g2);

        JRadioButton g3 = new JRadioButton("<Unknown>");
        g3.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                    viewdata_gender.setText("Gender: <Unknown>");
                 }//action perfomed;
            });//g3 add action listener
        gender_panel_body.add(g3);

        // Define a button group.
        ButtonGroup genderButtons = new ButtonGroup();
        genderButtons.add(g1);
        genderButtons.add(g2);
        genderButtons.add(g3);

            gender_panel_BG.addMouseListener(gender);
            content.add(gender_panel, gbc);
/////////////////////////////////Gender Panel Nest End//////////////////////////////////////////////////////////////
/////////////////////////////////Race Panel Nest Begins//////////////////////////////////////////////////////////////
            JPanel race_panel_BG = new JPanel(new BorderLayout())
                {
                protected void paintComponent(Graphics g)
                    {
                    //  Dispaly image at full size
                    g.drawImage(iconSM.getImage(), 0, 0, null);
                    super.paintComponent(g);
                    }
                };
            race_panel_BG.setOpaque( false );

            JLabel race_panel_label = new JLabel("Race");
            race_panel_label.setFont(new Font("Impact", Font.BOLD, 30));
            race_panel_label.setForeground(Color.white);
            race_panel_label.setOpaque(false);

            JPanel race_panel_body = new JPanel(new GridLayout(5, 8));
            race_panel_body.setBackground(Color.WHITE);

            race_panel_BG.add(race_panel_label, BorderLayout.NORTH);

            JPanel race_panel = new JPanel(new GridLayout(2, 1));
            //race_panel.setBorder(new EmptyBorder(0, 10, 0, 10));
            //race_panel.setBackground(Color.GREEN);
            race_panel.setOpaque(false);
            race_panel.add(race_panel_BG);
            race_panel.add(race_panel_body);

            for (int i=0; i <= 60; i++){
                ImageIcon RCicon = new ImageIcon("headshot.jpg");
                Image RCimg = RCicon.getImage();
                RCimg = RCimg.getScaledInstance(40, 40, java.awt.Image.SCALE_SMOOTH);
                final ImageIcon RCiconSM = new ImageIcon(RCimg);
                JButton button = new JButton(RCiconSM);
                button.setBorder(BorderFactory.createEmptyBorder());
                button.setContentAreaFilled(false);
                race_panel_body.add(button);
            };//for loop

            MouseAdapter race = new MouseAdapterMod();
            race_panel_body.addMouseListener(race);
            content.add(race_panel, gbc);
/////////////////////////////////Race Panel Nest End//////////////////////////////////////////////////////////////
/////////////////////////////////Class Panel Nest Begins//////////////////////////////////////////////////////////////
            JPanel class_panel_BG = new JPanel(new BorderLayout())
                {
                protected void paintComponent(Graphics g)
                    {
                    //  Dispaly image at full size
                    g.drawImage(iconSM.getImage(), 0, 0, null);
                    super.paintComponent(g);
                    }
                };
            class_panel_BG.setOpaque( false );

            JLabel class_panel_label = new JLabel("Class");
            class_panel_label.setFont(new Font("Impact", Font.BOLD, 30));
            class_panel_label.setForeground(Color.white);
            class_panel_label.setOpaque(false);

            JPanel class_panel_body = new JPanel(new GridLayout(5, 8));
            class_panel_body.setBackground(Color.WHITE);

            class_panel_BG.add(class_panel_label, BorderLayout.NORTH);

            JPanel class_panel = new JPanel(new GridLayout(2, 1));
            //class_panel.setBorder(new EmptyBorder(0, 10, 0, 10));
            //class_panel.setBackground(Color.GREEN);
            class_panel.setOpaque(false);
            class_panel.add(class_panel_BG);
            class_panel.add(class_panel_body);

            for (int g=0; g <= 50; g++){
                ImageIcon CCicon = new ImageIcon("headshot.jpg");
                Image CCimg = CCicon.getImage();
                CCimg = CCimg.getScaledInstance(40, 40, java.awt.Image.SCALE_SMOOTH);
                final ImageIcon CCiconSM = new ImageIcon(CCimg);
                JButton cbutton = new JButton(CCiconSM);
                cbutton.setBorder(BorderFactory.createEmptyBorder());
                cbutton.setContentAreaFilled(false);
                class_panel_body.add(cbutton);
            };//for loop

            MouseAdapter cclass = new MouseAdapterMod();
            class_panel_body.addMouseListener(cclass);
            content.add(class_panel, gbc);
/////////////////////////////////Class Panel Nest End//////////////////////////////////////////////////////////////
/////////////////////////////////Base Stats Panel Nest Begins//////////////////////////////////////////////////////////////
            JPanel base_stats_panel_BG = new JPanel(new BorderLayout())
                {
                protected void paintComponent(Graphics g)
                    {
                    //  Dispaly image at full size
                    g.drawImage(iconSM.getImage(), 0, 0, null);
                    super.paintComponent(g);
                    }
                };
            base_stats_panel_BG.setOpaque( false );

            JLabel base_stats_panel_label = new JLabel("Base Attributes");
            base_stats_panel_label.setFont(new Font("Impact", Font.BOLD, 30));
            base_stats_panel_label.setForeground(Color.white);
            base_stats_panel_label.setOpaque(false);

            JPanel base_stats_panel_body = new JPanel(new GridLayout(1, 2));
            base_stats_panel_body.setBackground(Color.WHITE);

            base_stats_panel_BG.add(base_stats_panel_label, BorderLayout.NORTH);

            JPanel base_stats_panel = new JPanel(new GridLayout(2, 1));
            //base_stats_panel.setBorder(new EmptyBorder(0, 10, 0, 10));
            //base_stats_panel.setBackground(Color.GREEN);
            base_stats_panel.setOpaque(false);
            base_stats_panel.add(base_stats_panel_BG);
            base_stats_panel.add(base_stats_panel_body);

            MouseAdapter base_stats = new MouseAdapterMod();
            base_stats_panel_body.addMouseListener(base_stats);
            content.add(base_stats_panel, gbc);
/////////////////////////////////Base Stats Panel Nest End//////////////////////////////////////////////////////////////
/////////////////////////////////Merits Panel Nest Begins//////////////////////////////////////////////////////////////
            JPanel merits_panel_BG = new JPanel(new BorderLayout())
                {
                protected void paintComponent(Graphics g)
                    {
                    //  Dispaly image at full size
                    g.drawImage(iconSM.getImage(), 0, 0, null);
                    super.paintComponent(g);
                    }
                };
            merits_panel_BG.setOpaque( false );

            JLabel merits_panel_label = new JLabel("Advantages and Disadvantages");
            merits_panel_label.setFont(new Font("Impact", Font.BOLD, 30));
            merits_panel_label.setForeground(Color.white);
            merits_panel_label.setOpaque(false);

            JPanel merits_panel_body = new JPanel(new BorderLayout());
            merits_panel_body.setBackground(Color.WHITE);

            merits_panel_BG.add(merits_panel_label, BorderLayout.NORTH);

            JPanel merits_panel = new JPanel(new GridLayout(2, 1));
            //merits_panel.setBorder(new EmptyBorder(0, 10, 0, 10));
            //merits_panel.setBackground(Color.GREEN);
            merits_panel.setOpaque(false);
            merits_panel.add(merits_panel_BG);
            merits_panel.add(merits_panel_body);

            MouseAdapter merits = new MouseAdapterMod();
            merits_panel_body.addMouseListener(merits);
            content.add(merits_panel, gbc);
/////////////////////////////////Merits Panel Nest End//////////////////////////////////////////////////////////////
/////////////////////////////////Group Panel Nest Begin//////////////////////////////////////////////////////////////
            JPanel viewData = new JPanel(new GridLayout(5, 1));
            viewData.add(gender_panel);
            viewData.add(race_panel);
            viewData.add(class_panel);
            viewData.add(base_stats_panel);
            viewData.add(merits_panel);

            panel.add(new JScrollPane(viewData));
            return panel;
/////////////////////////////////Group Panel Nest End//////////////////////////////////////////////////////////////
        }//end right pane
/////////////////////////////////Right Panel Nest End//////////////////////////////////////////////////////////////

        public class MouseAdapterMod extends MouseAdapter {
           // usually better off with mousePressed rather than clicked
           public void mousePressed(MouseEvent e) {
                   //System.out.println(e.getSource());
                   System.out.println("A mouse was pressed");
               if (e.getSource() == "gender_panel_BG"){
                gender_panel_body.setVisible(!gender_panel_body.isVisible());
               }//end of  if (e.getSource() == "gender")
           }//end of mousePressed(MouseEvent e)
        }//end of MouseAdapterMod extends MouseAdapter
    }//end master panel set
}//end master class

1 个答案:

答案 0 :(得分:1)

  

现在我需要弄清楚如何选择多个JButton。它不是一个复选框,因为我想要图像而不是勾选框。

JToggleButtonJCheckBox的父级,适用于此,因为每个按钮都知道其所选状态。您可以将GridLayout实例嵌套在垂直Box中,如下所示。

image

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToggleButton;
import javax.swing.UIManager;
import javax.swing.border.TitledBorder;

/** @see http://stackoverflow.com/a/16733710/230513 */
public class Test {

    private static final int N = 4;

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Box b = new Box(BoxLayout.Y_AXIS);
        b.add(createPanel());
        b.add(createPanel());
        f.add(new JScrollPane(b){

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 500);
            }
        });
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private JPanel createPanel() {
        JPanel p = new JPanel(new GridLayout(N, N));
        p.setBorder(new TitledBorder(String.valueOf(p.hashCode())));
        for (int i = 0; i < N * N; i++) {
            p.add(createButton());
        }
        return p;
    }

    private JToggleButton createButton() {
        JToggleButton b = new JToggleButton(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(e.getActionCommand());
            }
        });
        b.setIcon(UIManager.getIcon("html.pendingImage"));
        b.setText(String.valueOf(b.hashCode()));
        b.setHorizontalTextPosition(JToggleButton.CENTER);
        b.setVerticalTextPosition(JToggleButton.BOTTOM);
        return b;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().display();
            }
        });
    }
}