java Swing : in paintComponent method how to know what to repaint?

标签 java swing

我的组件比屏幕大,部分组件没有显示(我将使用滚动条)。
当我在 paintComponent(g) 中收到调用时,我如何知道我应该绘制哪个区域?

最佳答案

我不确定这是不是你的意思,但问题是你每次接到电话时都必须在 JScrollPane 上调用 repaint()JPanelpaintComponent(Graphics g) 中,否则 JPanel 上的更新将不会在 JScrollPane 中可见.

我还看到你想使用 JScrollBar(或者你可能混淆了术语)?我推荐一个 JScrollPane

我做了一个小例子,它是一个 JPanel,它有一个网格,每 2 秒改变一次颜色(红色到黑色,反之亦然)。 JPanel/Grid 比 JScrollPane 大;不管我们必须在 JScrollPane 实例上调用 repaint() 否则网格不会改变颜色:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Test {

    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().createAndShowUI();
            }
        });
    }

    private void createAndShowUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initComponents(frame);
        frame.setPreferredSize(new Dimension(400, 400));
        frame.pack();
        frame.setVisible(true);
    }

    private void initComponents(JFrame frame) {
        JScrollPane jsp = new JScrollPane();
        jsp.setViewportView(new Panel(800, 800, jsp));
        frame.getContentPane().add(jsp);
    }
}

class Panel extends JPanel {

    private int across, down;
    private Panel.Tile[][] tiles;
    private Color color = Color.black;
    private final JScrollPane jScrollPane;

    public Panel(int width, int height, JScrollPane jScrollPane) {
        this.setPreferredSize(new Dimension(width, height));
        this.jScrollPane = jScrollPane;
        createTiles();
        changePanelColorTimer();//just something to do to check if its repaints fine
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (int i = 0; i < across; i++) {
            for (int j = 0; j < down; j++) {
                g.setColor(color);
                for (int k = 0; k < 5; k++) {
                    g.drawRect(tiles[i][j].x + k, tiles[i][j].y + k, tiles[i][j].side - k * 2, tiles[i][j].side - 2 * k);
                }
            }
        }
        updateScrollPane();//refresh the pane after every paint
    }

    //calls repaint on the scrollPane instance
    private void updateScrollPane() {
        jScrollPane.repaint();
    }

    private void createTiles() {
        across = 13;
        down = 9;
        tiles = new Panel.Tile[across][down];

        for (int i = 0; i < across; i++) {
            for (int j = 0; j < down; j++) {
                tiles[i][j] = new Panel.Tile((i * 50), (j * 50), 50);
            }
        }
    }

    //change the color of the grid lines from black to red and vice versa every 2s
    private void changePanelColorTimer() {
        Timer timer = new Timer(2000, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (color == Color.black) {
                    color = Color.red;
                } else {
                    color = Color.black;
                }
            }
        });
        timer.setInitialDelay(2000);
        timer.start();
    }

    private class Tile {

        int x, y, side;

        public Tile(int inX, int inY, int inSide) {
            x = inX;
            y = inY;
            side = inSide;
        }
    }
}

Panel 类中,如果我们在 paintComponent(Graphics g) 中注释 updateScrollPane(); 行,我们将不会看到网格改变颜色.

关于java Swing : in paintComponent method how to know what to repaint?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12653927/

相关文章:

java - Java 中 GUI 的 JUnit 测试

java - 为 RMI 注册表创建 Windows 服务

java - 获取邮件接收日期 JavaMail

java - 如何复制 JPanel?

java - swt 或 swing 中的边框布局

java - JFrame 找不到 'pack' 方法

java - 如何向 JSON 字符串添加附加属性?

java - 按 'q' 结束 for 循环

java - 使用 java swing 制作 10x10 板

java - 在文本区域显示文本