Итак, у меня есть JFrame размером 500x500, на котором я рисую линию от (0,200) до (100000,200) с помощью g.drawLine (x, y). Проблема в том, что я не вижу всей строки, поскольку нет полосы прокрутки. Может кто-нибудь рассказать мне, как иметь полосу прокрутки в этой конкретной ситуации, чтобы увидеть всю линию до точки (100000 200).Полоса прокрутки на JFrame в Java Swing
0
A
ответ
1
Можете ли вы показать нам код? Так как это трудно понять, не видя его, однако в верхней части моей головы, я думаю, вы должны просто создать и добавить его в 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));
3
в то время как у меня usability concerns, в приведенном ниже примере показано, как реализовать интерфейс Scrollable
, как описано в How to Use Scroll Panes: Implementing a Scrolling-Savvy Client. Обратите внимание, в частности, как результат 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);
}
}
Поскольку никто не хочет, чтобы прокрутить, что далеко, то, что [* актуальная проблема *] (http://meta.stackoverflow.com/q/66377/163188) вы пытаетесь решить? – trashgod