【发布时间】:2018-07-07 12:04:34
【问题描述】:
我的问题与带有内部JPanel 的JScrollPane 有关。我尝试在JPanel 上绘图,但它非常短暂地出现然后消失,直到我手动移动HorizontalScrollBar,然后再次出现并保持稳定。为了避免手动干预(或在实际代码中难以管理的HorizontalScrollBar.setValue),我在JPanel、Viewport、JScrollPane 和@987654330 上尝试了validate/revalidate(以及更多)但未成功@。
下面的(非常)简化的代码重现了该问题。可能很明显,但我看不到。
public class Main {
private JFrame mainPane;
private RenderZone renderZone = new RenderZone();
private JScrollPane renderScrollPane = new JScrollPane(renderZone,
JScrollPane.VERTICAL_SCROLLBAR_NEVER,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Main window = new Main();
window.mainPane.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Main() {
initialize();
}
private void initialize() {
mainPane = new JFrame();
mainPane.setPreferredSize(new Dimension(1024, 768));
mainPane.setSize(new Dimension(1024, 768));
mainPane.setLocation(new Point(200, 200));
mainPane.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SpringLayout springLayout = new SpringLayout();
springLayout.putConstraint(SpringLayout.NORTH, renderScrollPane, 0, SpringLayout.NORTH, mainPane.getContentPane());
springLayout.putConstraint(SpringLayout.WEST, renderScrollPane, 0, SpringLayout.WEST, mainPane.getContentPane());
springLayout.putConstraint(SpringLayout.SOUTH, renderScrollPane, 0, SpringLayout.SOUTH, mainPane.getContentPane());
springLayout.putConstraint(SpringLayout.EAST, renderScrollPane, 0, SpringLayout.EAST, mainPane.getContentPane());
mainPane.getContentPane().setLayout(springLayout);
mainPane.getContentPane().add(renderScrollPane);
}
public class RenderZone extends JPanel {
private static final long serialVersionUID = -8240875812801921009L;
private BufferedImage image = null;
private BufferedImage sub = null;
public RenderZone() {
this.setBackground(Color.WHITE);
this.setPreferredSize(new Dimension(1124, 768));// added 100 for test purpose
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);// pour repeindre la panel à chaque fois
Graphics2D g2 = (Graphics2D)this.getGraphics();
if(image==null) {
try {
image = ImageIO.read(RenderZone.class.getResourceAsStream("TestImage0.png"));
sub = image.getSubimage(0, 0, 1024, 768);
} catch (IOException e) {}
}
if( sub!=null)g2.drawImage(sub, 0, 0, null);
g2.dispose();
}
}
}
【问题讨论】:
标签: java swing jpanel jscrollpane