[英]Scroll bar on JFrame in Java Swing
因此,我有一个大小为500x500的JFrame,使用g.drawLine(x,y)在(0,200)到(100000,200)之间绘制一条线。 问题是我看不到整行,因为没有滚动条。 有人可以告诉我在这种特殊情况下如何使用滚动条来查看整条线直到点(100000,200)。
尽管我有可用性方面的问题 ,但下面的示例说明了如何实现Scrollable
接口,如如何使用滚动窗格:实现精通滚动的客户端中所述 。 特别注意, getPreferredScrollableViewportSize()
的结果与getPreferredSize()
的结果有何不同。 单位和块的增量也使分页更加容易。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.SwingConstants;
/**
* @see https://stackoverflow.com/a/37460185/230513
*/
public class Test {
private void display() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JScrollPane(new DrawingPanel()));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private static class DrawingPanel extends JPanel implements Scrollable {
private static final int W = 100_000;
private static final int H = 400;
@Override
public Dimension getPreferredSize() {
return new Dimension(W, H);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2);
g.drawLine(0, getHeight() / 4, 0, 3 * getHeight() / 4);
g.drawLine(W - 1, getHeight() / 4, W - 1, 3 * getHeight() / 4);
}
@Override
public Dimension getPreferredScrollableViewportSize() {
return new Dimension(640, H);
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
if (orientation == SwingConstants.HORIZONTAL) {
return W / 10;
} else {
return 10;
}
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
if (orientation == SwingConstants.HORIZONTAL) {
return W / 10;
} else {
return 10;
}
}
@Override
public boolean getScrollableTracksViewportWidth() {
return false;
}
@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Test()::display);
}
}
您能告诉我们代码吗? 既然很难不知道就知道,但是在我的头上,我想您应该创建一个并将其添加到您的JFrame中,如下所示:
JTextArea ta = new JTextArea(); // Example with a JTextArea,
depends on what you have, as I said, we need to see the code
JScrollPane sp = new JScrollPane(ta); //Add it to the component
needed, in your case the drawn line i guess
jFrame.add(sp); //Add it to the frame
在添加Ande之前,您可以控制尺寸:
sp.setColumnHeaderView(new JLabel("header column"));
sp.setRowHeaderView(new JLabel("header row"));
sp.setPreferredSize(new Dimension(500, 300));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.