簡體   English   中英

GridBagLayout和繪圖

[英]GridBagLayout and drawing

我正在做一個小游戲,一開始我想讓JCheckBox選擇語言(在此之后,他們會設置更多的語言來設置游戲),然后在上面用帶有游戲名稱的圖片的jlabel繪制圖像那里 ,問題是我不知道如何用復選框將面板居中,然后再使用GridBagLayout ,當我使用它時,我無法在框架上繪制任何東西,id還想刪除復選框周圍的那些灰線(如果它可能,感謝任何幫助,謝謝。

這是我的第二個問題,我還不能添加圖像,因此這是圖片的鏈接:

這是圖片

這是框架的代碼

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

“問題是我不知道如何用復選框將面板居中,然后再使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM