Cleaning up a Nested J panel

无人久伴 提交于 2019-12-11 11:24:53

问题


Rebuilt the SCCE for you guys.

My goal is this

The general idea is that clicking on the title bars of the menus (right side) will collapsible (set visible to false) the content panes associated with them:
gender_panel_BG collapses gender_panel_body
race_panel_BG collapses race_panel_body
class_panel_BG collapses class_panel_body
base_stats_panel_BG collapses base_stats_panel_body
merits_panel_BG collapses merits_panel_body

You get the idea

Another thing that is bugging me is the huge space at the top of the body and it's content.


Gradient bar img source

background source 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:


Now I need to figure out how to select multiple JButtons. It's not quite a check box, as I want to have images instead of tick boxes.

JToggleButton, the parent of JCheckBox, works well for this, as each button knows its selected state. You can nest GridLayout instances in a vertical Box, as shown below.

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();
            }
        });
    }
}


来源:https://stackoverflow.com/questions/16680913/cleaning-up-a-nested-j-panel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!