java - GridBag布局和绘图

标签 java swing user-interface layout

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

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

here is the picture

这是框架的代码

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

最佳答案

" the problem is that i dont know any other way how to center the panel with checkboxes then to use GridBagLayout and when i use this, i cannot draw anything to the frame"

如果没有完整的示例,我无法真正判断您做错了什么。我什至不知道你想在哪里添加图像。但不要尝试在框架上绘画。改为在 JPanel 上绘图。

这是一个示例,您也许可以从中获得一些见解。

enter image description here

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

可以轻松完成同样的操作

enter image description here

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

关于java - GridBag布局和绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22127307/

相关文章:

java - NoClassDefFoundError : com/google/appengine/api/urlfetch/ResponseTooLargeException

关于在 java 中创建类数组的 java.lang.ClassCastException

java - java swing中多个多边形上的鼠标事件

c++ - 使用文本调整 QToolButton 的大小

android - 如何以编程方式在 Android 中创建 ListView 和标题(动态)?

Java通过命令行播放音频文件

java - Guice + Jersey 2 + ContainerRequestFilter 和 @Context

java - 组合盒,自动填充。 java

java - JPanel 上没有出现或移动框..Java

HTML/CSS 布局 - 动态宽度