滚动没有出现

时间:2013-01-14 18:00:05

标签: java swing jframe jpanel jscrollpane

我想将JScrolpane添加到JPanel,但是没有出现。在JLabel工作正常,非常容易。我正在使用JPanel,因为我会在程序中添加一些图像处理内容。有我的代码:

public void draw(){  
 panel=new JPanel(){
        protected void paintComponent(Graphics g){
            Graphics g2 = g.create();
            g2.drawImage(image, 0, 0, this);
            g2.dispose();             
        }         
 };   
 panel.setBorder(BorderFactory.createEtchedBorder());
 panel.setPreferredSize(new Dimension(400, 330));
 s=new JScrollPane(panel);
 s.setPreferredSize(new Dimension(400,285));
 this.getContentPane().add(s,BorderLayout.CENTER);
 add(panel);
 revalidate();  
 repaint();     
 }

3 个答案:

答案 0 :(得分:3)

 s=new JScrollPane(panel);
 s.setPreferredSize(new Dimension(400,285));
 this.getContentPane().add(s,BorderLayout.CENTER);
 add(panel); // ****** ????????????
 revalidate();  
 repaint();     
}

您将JPanel添加到GUI而不是JScrollPane,因此如果没有添加任何滚动窗格,您真的不应该期待它们。

解决方案:添加您的JScrollPane,它将JPanel保存到GUI,而不是JPanel本身。

答案 1 :(得分:3)

你不尊重画颜链,在重写的super.paintComponent(g)方法中调用paintComponent作为第一个调用。即

@Override
protected void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      //draw here
}

或可能出现视觉伪影。

  • 另请注意@Override注释,该注释应与重写方法一起使用,以便获得编译器检查我们正确覆盖方法的优势。

  • getContentPane().add(..)无需简单地将JFrame个实例添加为add(..),同时remove(..)setLayout(..)已转发至JFrame JFrame s contentPane

  • 也不是为了扩展JFrame frame=new JFrame("Title here"); ... frame.add(..); ... frame.pack(); frame.visible(true); 也不是理由,只需创建一个实例并使用它,即:

    Graphics
  • 同时绘制到传递给paintComponent g的{​​{1}}对象上,不要在paintComponent中创建自己的对象。当然,除非@HFOE在下面的评论中提及,否则你正在做的事情:)。

  • this中不需要drawImage(..)参数,除非您的JPanelImageObserver上实现,或者在绘制时图像可能无法完全加载。只需使用null

  • 仅针对顶部的樱桃,使用Graphics2DRenderHints here。这样可以绘制更高质量的图像和文本。

答案 2 :(得分:0)

我明白了!我的主要原因是没有布局管理器和没有声明的大小。有我的代码:

public void draw(){
 panel=new JPanel(new BorderLayout()){
 @Override
        protected void paintComponent(Graphics g){
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            g2d.drawImage(img, 0, 0, null);
        }         
 };   
 panel.setBounds(0, 0, img.getWidth(), img.getHeight());
 panel.setPreferredSize(new Dimension(img.getWidth(),obraz.getHeight()));
 JScrollPane scrolls=new JScrollPane(panel,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);

 add(scrolls);
 validate();  
 repaint();     
 }

但是如果有人想要在将来复制这段代码,有一件事要知道 - Jpanel的大小并不令人耳目一新(它总是第一张打开的图像的大小),但我有scrolsl而且我很满意目前 ;)。非常感谢大家。