1

我想将 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();     
 }
4

3 回答 3

3

你不尊重油漆链super.paintComponent(g)在被覆盖的方法中作为第一个调用调用paintComponent。IE

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

或可能出现视觉伪影。

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

  • 无需getContentPane().add(..)简单地调用 add on JFrameinstanceadd(..)并已转发remove(..)到s contentPanesetLayout(..)JFrame

  • 扩展也不是一个好主意JFrame,只需创建一个实例并使用它,即:

    JFrame frame=new JFrame("Title here");
    ...
    frame.add(..);
    ...
    frame.pack();
    frame.visible(true);
    
  • 还要绘制到Graphics传递给paintComponent的对象上,g不要去创建你自己的paintComponent。当然,除非您出于以下评论中提到的@HFOE 的原因而这样做:)。

  • 不需要this参数 indrawImage(..)除非您的JPanel工具打开ImageObserver或绘画时图像可能未完全加载。只需使用null.

  • 并且只是为了顶部的樱桃使用一些Graphics2D和在这里RenderHints看到的。这将允许绘制质量更好的图像和文本。

于 2013-01-14T18:12:12.943 回答
3
 s=new JScrollPane(panel);
 s.setPreferredSize(new Dimension(400,285));
 this.getContentPane().add(s,BorderLayout.CENTER);
 add(panel); // ****** ????????????
 revalidate();  
 repaint();     
}

您将 JPanel 添加到 GUI 而不是 JScrollPane,因此如果没有在任何地方添加滚动窗格,您真的不应该期望看到任何滚动窗格。

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

于 2013-01-14T18:08:52.963 回答
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 的大小不会令人耳目一新(它始终是第一个打开的图像的一个大小),但是我有 scrolll 并且我现在很满意; )。非常感谢大家。

于 2013-01-16T14:49:49.727 回答