【问题标题】:GridBagLayout and drawingGridBagLayout 和绘图
【发布时间】:2014-03-02 21:36:39
【问题描述】:

我正在制作一个小游戏,一开始我希望JCheckBox 用于选择语言(之后它们中的一些用于设置游戏),然后是jlabel 带有名称的图片游戏或 在那里绘制图像,问题是我不知道如何使用复选框将面板居中然后使用GridBagLayout,当我使用它时,我无法绘制任何东西框架,如果可能的话,我还想删除复选框周围的那些灰线,感谢任何帮助,谢谢。

这是我的第二个问题,我还不能添加图片,所以这里是图片的链接:

这是框架的代码

private GamePlan plan;
private JFrame frame;
private String language;
private JPanel panel;
private JCheckBox englishBox;
private JCheckBox germanBox;

public Settings(GamePlan plan){
    this.plan = plan;
    frame = new JFrame();
    frame.setSize(600, 500);
    frame.setLocation(200, 200);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new GridBagLayout());
    frame.setResizable(false);
    frame.setVisible(true);
    panel = new JPanel(new GridLayout(2, 1));
    englishBox = new JCheckBox("English", false);
    germanBox = new JCheckBox("German", false);
    englishBox.addActionListener(new EnglishLanguage());
    germanBox.addActionListener(new GermanLanguage());
    panel.add(englishBox);
    panel.add(germanBox);
    englishBox.setOpaque(false);
    germanBox.setOpaque(false);
    panel.setOpaque(false);
    frame.add(panel);
    frame.getContentPane().setBackground(new Color(216,252,202));
}

【问题讨论】:

  • 我没有看到您在哪里添加了带有图像的标签?你只是不知道该怎么做吗?

标签: java swing user-interface layout


【解决方案1】:

“问题是我不知道如何用复选框将面板居中然后使用GridBagLayout,当我使用它时,我无法在框架上绘制任何东西”

如果没有完整的示例,我真的无法判断您做错了什么。我什至看不到您要在哪里添加图像。但不要试图在框架上画画。改为使用JPanel

这里有一个例子,你或许可以从中获得一些见解。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;

public class ImageByDrawing {
    public ImageByDrawing() {
        ImagePanel imagePanel = new ImagePanel();
        imagePanel.setBorder(new TitledBorder("Drawn Image onto JPanel"));

        JCheckBox germanBox = new JCheckBox("German");
        germanBox.setOpaque(false);
        JCheckBox englishBox = new JCheckBox("English");
        englishBox.setOpaque(false);
        JPanel boxPanel = new JPanel();
        boxPanel.setBorder(new TitledBorder("JPanel with default FlowLayout"));
        boxPanel.setOpaque(false);
        boxPanel.add(germanBox);
        boxPanel.add(englishBox);

        JPanel centerPanel = new JPanel(new BorderLayout());
        centerPanel.add(imagePanel, BorderLayout.CENTER);
        centerPanel.add(boxPanel, BorderLayout.SOUTH);
        centerPanel.setBorder(new TitledBorder("JPanel with BorderLayout"));
        centerPanel.setOpaque(false);

        JPanel mainPanel = new JPanel(new GridBagLayout());
        mainPanel.add(centerPanel);
        mainPanel.setBorder(new TitledBorder("JPanel with GridBagLayout"));
        mainPanel.setBackground(new Color(216,252,202));

        JFrame frame = new JFrame();
        frame.add(mainPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setSize(600, 600);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public class ImagePanel extends JPanel {
        BufferedImage img;
        int dWidth;
        int dHeight;
        public ImagePanel() {
            try {
                img = ImageIO.read(getClass().getResource("/resources/stackblack.jpg"));
                dWidth = img.getWidth();
                dHeight = img.getHeight();
            } catch (IOException ex) {
                Logger.getLogger(ImageByDrawing.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); 
            g.drawImage(img, 0, 0, img.getWidth(), img.getHeight(), this);
        }
        @Override
        public Dimension getPreferredSize() {
            return (img == null) ? new Dimension(300, 300) : new Dimension(dWidth, dHeight);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new ImageByDrawing();
            }
        });
    }
}

我也不知道你为什么喜欢画这张图。使用JLabelImageIcon 也可以轻松完成同样的操作

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagLayout;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;

public class ImageByDrawing {

    public ImageByDrawing() {
        ImageIcon icon = new ImageIcon(getClass().getResource("/resources/stackblack.jpg"));
        JLabel label = new JLabel(icon);
        label.setBorder(new TitledBorder("JLabel with ImageIcon"));

        JCheckBox germanBox = new JCheckBox("German");
        germanBox.setOpaque(false);
        JCheckBox englishBox = new JCheckBox("English");
        englishBox.setOpaque(false);
        JPanel boxPanel = new JPanel();
        boxPanel.setBorder(new TitledBorder("JPanel with default FlowLayout"));
        boxPanel.setOpaque(false);
        boxPanel.add(germanBox);
        boxPanel.add(englishBox);

        JPanel centerPanel = new JPanel(new BorderLayout());
        centerPanel.add(label, BorderLayout.CENTER);
        centerPanel.add(boxPanel, BorderLayout.SOUTH);
        centerPanel.setBorder(new TitledBorder("JPanel with BorderLayout"));
        centerPanel.setOpaque(false);

        JPanel mainPanel = new JPanel(new GridBagLayout());
        mainPanel.add(centerPanel);
        mainPanel.setBorder(new TitledBorder("JPanel with GridBagLayout"));
        mainPanel.setBackground(new Color(216, 252, 202));

        JFrame frame = new JFrame();
        frame.add(mainPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setSize(600, 600);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new ImageByDrawing();
            }
        });
    }
}

您问题的最后一部分,正如@Jere 指出的那样,您可以将setFocusPainted 用于复选框germanBox.setFocusPainted(false);

【讨论】:

  • 要删除灰线,AbstractButton 类上有一个 setFocusPainted 方法,因此它可用于复选框。
猜你喜欢
  • 2021-01-29
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
相关资源
最近更新 更多