gpt4 book ai didi

java - JScrollPane 和 Graphics2D

转载 作者:行者123 更新时间:2023-11-29 03:16:15 31 4
gpt4 key购买 nike

我正在尝试绘制比 JFrame 更大的图形,并使用 JScrollPane 滚动整个图形。我用两行创建了一个简单的例子。滚动条出现但图形不显示。

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Test extends JPanel{

public static void main(String... args) {
Test test = new Test();
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.add(test);
JScrollPane scrollPane = new JScrollPane(panel);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setBounds(0, 0, 1350, 700);
JPanel contentPane = new JPanel(null);
contentPane.setPreferredSize(new Dimension(1400, 700));
contentPane.add(scrollPane);
frame.setContentPane(contentPane);
frame.pack();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}

@Override
protected void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D)g;

g2.drawLine(30,30,30,3000);
g2.drawLine(30, 400, 500, 3000);
}
}

最佳答案

欢迎来到一个很好的例子,为什么 null 布局很糟糕......

避免使用 null 布局,像素完美布局是现代 ui 设计中的一种错觉。影响组件单个尺寸的因素太多,没有一个是您可以控制的。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正

另见 Why is it frowned upon to use a null layout in SWING?更多详情...

基本问题是,JScrollPane 有一个 JViewport,它实际上包含您的组件。 JViewport 使用您的组件大小调整提示来确定它应该有多大,JScrollPane 使用 JViewport 做出的决定来确定它应该有多大是否需要显示滚动条。

JViewport 正在查看您的组件并决定,因为您没有另外告诉它,它的大小应该是 0x0

您可以通过向您的组件setBorder(new LineBorder(Color.RED)); 添加一个LineBorder 来证明这一点,您也不会看到它(或者如果你这样做,它将是一个红色的小方 block )

首先覆盖 Test 面板的 getPrefferedSize 方法并返回一些合适的大小

接下来,在您执行任何自定义绘画之前调用 super.paintComponent,否则您最终会得到一些很棒但令人讨厌的绘画工件...

ScrollPane

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test extends JPanel {

public static void main(String... args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

Test test = new Test();
JFrame frame = new JFrame();
JScrollPane scrollPane = new JScrollPane(test);
frame.add(scrollPane);
frame.pack();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
});
}

@Override
public Dimension getPreferredSize() {
return new Dimension(3000, 3000);
}



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

g2.drawLine(30, 30, 30, 3000);
g2.drawLine(30, 400, 500, 3000);
}
}

您可能想看一下 Scrollable接下来是 interface,因此您可以控制 JViewport 的默认大小,这样它就不会尝试填满整个屏幕。

看看Implementing a Scrolling-Savvy Client了解更多详情

关于java - JScrollPane 和 Graphics2D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26415863/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com