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

使用JPanel绘图使JScrollPanel动态调整大小

左宁
2023-03-14

我有一个JScroll面板和一个JGroup添加到它。我想绘制到JGroup并使JScrollPane的滚动条在绘图超过面板大小时出现,并且能够垂直和水平滚动绘图。

我尝试过咨询各种论坛和官方文档,并尝试了一些事情(设置边框、首选尺寸等),但似乎都没有产生预期的效果。

我有一个JFrame(附带GridBagLayout,btw.):

            JFrame frame1 = new JFrame("Application");
            frame1.setVisible(true);
            frame1.setMinimumSize(new Dimension(580,620));
            frame1.setResizable(false);
            frame1.setLocationRelativeTo(null);
            frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

相关组件包括:

            JPanel panel1 = new JPanel();
            JScrollPane scrollPane = new JScrollPane(panel1);
            frame1.add(scrollPane, gbc_panel1); //added with layout constraints

JPanel公司:

            panel1.setBackground(Color.BLACK);
            panel1.setPreferredSize(new Dimension(500,500));
            panel1.setMinimumSize(new Dimension(360,360));
            panel1.setMaximumSize(new Dimension(1000,1000));

JScrollPane:

            scrollPane.setAutoscrolls(true);

绘制图形的按钮的操作事件中的相关代码:

            Graphics g;
            g = panel1.getGraphics();
            panel1.paint(g);
            g.setColor(new Color(0,128,0));

            /* this is followed by some more code that 
            does the drawing of a maze with g.drawLine() methods */

代码绘制得很完美,我似乎不知道如何实现滚动和动态调整大小。

如果有任何有用的意见或评论,我将不胜感激!

非常感谢。

共有1个答案

邢博文
2023-03-14

最终,重写绘制方法实现了@MadProgrammer所建议的技巧。我只是希望我可以在不必定义自定义JPanel类的情况下完成绘制,但看起来它不是这样工作的。

自定义类如下所示:

class Drawing extends JPanel {

int mazeSize;

public Drawing(JTextField jtf)
{
    try {
    this.mazeSize = Integer.parseInt(jtf.getText());
    }

    catch (Exception e) 
    {
        JOptionPane.showMessageDialog(this, "ERROR!  Invalid size value!");
    }
} // the constructor gets the size of the drawing from a textField

public Dimension getPreferredSize() {
    return new Dimension(mazeSize*10,mazeSize*10);
} //getPreferredSize - this method is used by the scroll pane to adjust its own size automatically

public void drawMaze (Graphics g) 
{
    /* some irrelevant code that does the desired drawing to the panel by calling g.drawLine()*/

} // drawMaze method that does the de facto drawing

@Override
public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    drawMaze(g);        
}// paintComponent() @Override method - this was the tricky part

}//Drawing JPanel subclass

还值得注意的是(如果像我这样的noob碰巧遇到这个问题),在action事件中实例化新的JPanel子类后,我必须以以下方式将其添加到JScrollPanel中,而不仅仅是使用其add()方法:

Drawing drawPanel = new Drawing(textfield1);
scrollPane.getViewport().add(drawPanel);

再次感谢您的建议!

完成程序(使用递归回溯算法的随机迷宫生成器)后,我将在github概要文件中提供源代码

 类似资料:
  • 问题内容: 我有一个与作为布局经理。 在南边界中,我有一个,我希望用户可以调整其大小,即用户可以单击边界的边缘并将其向上拖动以使其变大。 您是否知道我可以做到这一点? 问题答案: 为了使框架中的面板可单独调整大小,您需要将其添加到。 而不是将其放置在框架的南部,而是将其放置在中心。拆分窗格将使拆分中的底部面板看起来像在南方,而拆分中的顶部面板将位于框架的中心。 确保使用设置两个面板的方向。 然后,

  • 我被一些奇怪的东西卡住了。我有一个带有JScrollPane的JFrame,其中包含一个比实际屏幕大得多的jPanel。我用圆柱画正方形,我希望这些正方形越过JPanel的右边框。(以便在向右滚动时显示它们。)但是使用paintComponents方法绘制的方块只是在JScrollPane的可见视口处停止。 下面是JFrame内部的JScrollPane的代码: public void initC

  • 起初,我只有文本栏和状态栏,如下例所示(我不需要父容器): 这是应该的。但是,请记住状态栏的高度。现在,如果您将StatusBar类更改为下面的类,那么高度几乎会增加一倍。为什么会这样? 这种设置并不需要更多的垂直空间: 我可以让这成为一个新问题,但我觉得不值得...

  • 问题内容: 我有一个快速的问题,我不太确定要进行设置。我在其他地方看到过示例,但没有什么比我的情况更具体。我想使用PHP调整图像的大小,以使图像易于阅​​读,而不仅仅是像使用HTML那样随意拉伸。如果它们的宽度不是250像素,也不是160像素,那么如何调整图片的大小,使其成比例但适合该空间? 谢谢! 问题答案: 好的,下面是我在商店中使用的Image对象。保持规模-需要GD 我在请求时调整图像的大

  • 我制作了一个包含三个jpanel的jframe,这三个panel将jframe分成三个相等的部分。每一个面板都包含一个图像。我想调整图像和面板的大小,当帧的大小从高到低的时候。有人能告诉我如何做吗。

  • 问题内容: 我有一个子类,可以在其上添加按钮,标签,表格等。要在屏幕上显示,请使用: 但是,当我调整窗口大小时,面板的大小不会改变。即使调整了尺寸,如何使面板的尺寸与窗口的尺寸相同? 问题答案: 您可以设置一个类似于BorderLayout的布局管理器,然后更具体地定义面板应该放置的位置: 这会将面板置于框架的中央区域,并在调整框架大小时自动增长。