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
 s=new JScrollPane(panel);
 s.setPreferredSize(new Dimension(400,285));
 this.getContentPane().add(s,BorderLayout.CENTER);
 add(panel); // ****** ????????????
 revalidate();  
 repaint();     
}

JScrollPaneではなくJPanelをGUIに追加しているので、どこにも追加されていないスクロールペインが表示されることを期待するべきではありません。

解決策:JPanel自体ではなく、JPanelを保持するJScrollPaneをGUIに追加します。

于 2013-01-14T18:08:52.963 に答える
3

ペイントチェーンを尊重せずsuper.paintComponent(g)、オーバーライドされたpaintComponentメソッドの最初の呼び出しとして呼び出します。すなわち

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

または視覚的なアーティファクトが発生する可能性があります。

  • @Overrideまた、メソッドを正しくオーバーライドしたことをコンパイラーがチェックする利点を得るために、オーバーライドされたメソッドで使用する必要があるアノテーションにも注意してください。

  • と一緒にaddoninstanceをgetContentPane().add(..)呼び出す必要はなく、 scontentPaneに転送されていますJFrameadd(..)remove(..)setLayout(..)JFrame

  • また、理由も理由もなく拡張するのは良い考えではありJFrameません。単にインスタンスを作成し、それを使用します。

    JFrame frame=new JFrame("Title here");
    ...
    frame.add(..);
    ...
    frame.pack();
    frame.visible(true);
    
  • また、GraphicspaintComponentに渡されたオブジェクトに描画し、gで独自のオブジェクトを作成しないでくださいpaintComponent。もちろん、@HFOEが以下のコメントで言及されている理由でそうしている場合を除きます:)。

  • ペイントが発生したときに、実装またはイメージが完全にロードされない場合を除いて、thisパラメータを入力する必要はありません。単に使用してください。drawImage(..)JPanelImageObservernull

  • そして、上の桜のためだけにいくつかGraphics2Dを使用し、ここRenderHintsに見られるように。これにより、より高品質の画像とテキストを描画できます。

于 2013-01-14T18:12:12.943 に答える
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();     
 }

しかし、誰かが将来このコードをコピーしたい場合は、知っておくべきことが1つあります。Jpanelのサイズは更新されません(常に最初に開いた画像の1つのサイズです)が、私はscrolslを持っており、今のところ満足しています。 )。みなさん、どうもありがとうございました。

于 2013-01-16T14:49:49.727 に答える