当前位置: 首页 > 知识库问答 >
问题:

Java-使用GridLayout和鼠标交互式JPanels创建JFrame

蒋烨然
2023-03-14

(初学者)
嗨,很抱歉问这个问题,但是我总是有错误从哪里冒出来,我希望这个程序很简单。

package pixelpainter;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
import static javax.swing.JFrame.EXIT_ON_CLOSE;

public class PixelPainter extends JPanel {
int width = 20;
int height = 20;
int pixSize = 10;
Color bGColor = Color.WHITE;
Dimension pixDim = new Dimension(pixSize,pixSize);
private JPanel panelClicked = null;
JFrame frame= new JFrame();

/**
 * @param args the command line arguments
 */
public PixelPainter()
{
    initGUI();
}

public void initGUI() {

    frame.setLayout(new GridLayout(height, width, 0, 0));
    frame.setSize((height * pixSize), (width * pixSize));
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    int[][] pixGrid = new int [width][height];

    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            JPanel pixel[][] = new JPanel[width][height];
            frame.add(pixel[row][col]);
            pixel[row][col].setBackground(bGColor);
            pixel[row][col].setPreferredSize(pixDim);
            pixel[row][col].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            pixel[row][col].addMouseListener(new MouseAdapter()
            {
                @Override
                public void mouseClicked(MouseEvent click)
                {
                    JPanel selectedPixel = (JPanel) getComponentAt(click.getPoint());
                    if (selectedPixel == null || selectedPixel == PixelPainter.this)
                    {
                        return;
                    }
                    if (selectedPixel != null)
                    {
                        selectedPixel.setBackground(Color.BLACK);
                    }
                }
                @Override
                public void mousePressed(MouseEvent press)
                {

                }
            });
        }
    }
}

public static void main(String[] args){
    EventQueue.invokeLater(new Runnable(){
        @Override
                public void run(){
                    new PixelPainter().setVisible(true);
                }
            });     
    }

}

理想情况下,我会在填充颜色时使用2D数组JFrame,但显然它们必须是final或实际上是final。

共有1个答案

长孙正卿
2023-03-14

我重新安排了你的代码,把类似的东西组合在一起。

下面是我创建的GUI。

我对您的代码做了以下更改。

由于model/view/controller模式,我将鼠标适配器代码拉到它自己的类中。分离关注点可以使GUI的每个部分更容易地正常工作。

代码是这样的。

package com.ggl.testing;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PixelPainter implements Runnable {

    private JFrame frame;

    public static void main(String[] args) {
        EventQueue.invokeLater(new PixelPainter());
    }

    @Override
    public void run() {
        initGUI();
    }

    public void initGUI() {
        frame = new JFrame("Pixel Art");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(createPixels());

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JPanel createPixels() {
        int width = 30;
        int height = 20;

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(height, width, 0, 0));

        for (int row = 0; row < height; row++) {
            for (int column = 0; column < width; column++) {
                PixelPanel pixelPanel = new PixelPanel();
                pixelPanel.addMouseListener(new ColorListener(pixelPanel));
                panel.add(pixelPanel);
            }
        }

        return panel;
    }

    public class PixelPanel extends JPanel {

        private static final long serialVersionUID = 8465814529701152253L;

        private static final int PIXEL_SIZE = 20;

        private Color backgroundColor;

        public PixelPanel() {
            this.backgroundColor = Color.WHITE;
            this.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            this.setPreferredSize(new Dimension(PIXEL_SIZE, PIXEL_SIZE));
        }

        public Color getBackgroundColor() {
            return backgroundColor;
        }

        public void setBackgroundColor(Color backgroundColor) {
            this.backgroundColor = backgroundColor;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.setColor(getBackgroundColor());
            g.fillRect(0, 0, getWidth(), getHeight());
        }
    }

    public class ColorListener extends MouseAdapter {

        private PixelPanel panel;

        public ColorListener(PixelPanel panel) {
            this.panel = panel;
        }

        @Override
        public void mousePressed(MouseEvent event) {
            if (event.getButton() == MouseEvent.BUTTON1) {
                panel.setBackgroundColor(Color.BLUE);
                panel.repaint();
            } else if (event.getButton() == MouseEvent.BUTTON3) {
                panel.setBackgroundColor(Color.WHITE);
                panel.repaint();
            }
        }
    }

}
 类似资料:
  • 我正在研究为我们的客户报告工具创建PDF报告的不同方法。我找到了这个链接,他们可以在PDF文档上执行操作和表单。有可能以编程方式生成这些PDF吗?比如有没有API可以创建这样的PDF? 我使用过apache POI和iText,但它没有这些功能。有没有人遇到过任何开源或商业工具用于此目的? 我的主要目标用户将是iPad用户。因此在objective c中使用此API也会有所帮助。

  • 所属类别 交互(Interactions) | 实用工具(Utilities) 用法 描述:基本交互层。 依赖: 部件库(Widget Factory) 注释:与 jQuery.Widget 相似,鼠标交互的目的不是直接使用。这是一个纯粹给其他小部件继承用的基础层。该页面有添加到 jQuery.Widget 的文档,但是它包含了不能被覆盖的内部方法。公共的 API 是 _mouseStart()、

  • 我试图使用GridBagLayout将两个JPanel放置到一个JFrame上。第一个JPanel使用gridLayout创建35列和27行JButtons,宽度应该是JFrame的3/4。此面板需要填充其可用的垂直空间。第二个JPanel也使用gridLayout,应该填充主JFrame的最后1/4。 不幸的是,我的第一个JPanel(sPan)甚至不适合屏幕,并迫使整个第二个JPanel(cP

  • 下面的代码生成九个单独的JPanels,其中有9个按钮。九个JPanel使用GridLayout排列到一个基本JPanel上。然后使用边框布局将这个基本JPanel放置到ContentPane上。我对JButtons和每个JPanel使用边框来明确定义它们的分离。每个JPanel中的JButtons看起来都很好,但是JPanels之间有一个间隙,这导致了双行的出现,这让我非常恼火。我尝试将每个JP

  • 其思想是用户选择一个输入,并且对应于该输入的标记(将从对应输入的数据集中提取的lat/long)显示在传单地图中(具有放大/缩小功能)。任何帮助/建议将不胜感激! (示例数据文件上载于此):

  • 问题内容: 我有一个带有悬停效果的菜单栏,现在我想在一个菜单项上放置一个带有圆圈和“手绘”文本的透明图像。如果我使用绝对定位将叠加图像放置在菜单项上方,则用户将无法单击该按钮,并且悬停效果将不起作用。 有什么办法可以禁用鼠标与此覆盖图像的交互,以使菜单即使在图像下方也能像以前一样继续工作? 编辑: 因为菜单是使用joomla生成的,所以我无法仅调整菜单项之一。即使可以,我也不认为使用javascr