2016-08-16 26 views
0

私はこのプログラムで常にスクロールするJScrollPaneを取得しようとしています。私はまた、ボタンがクリックされた後に画像が縮小してもスクロールするようにしています。私はJFrameが最大化されているときにのみスクロールするスクロールペインを得ることができます。また、ボタンをクリックしたときにJScrollPane内のイメージが半分になると、JScrollPaneは表示されなくなります。私は、JScrollPaneにPanelを保持するJFrameよりもはるかに大きなパネルを保持させることにより、JScrollPaneに水平および垂直のスクロールバーを常に持たせることができると考えました。可能であれば、以下のコードを参照してデバッグをお手伝いしてください。jscrollpane領域をスクロールするにはどうすればよいですか?

package Ex3; 

import java.awt.Robot; 
import java.awt.Toolkit; 
import java.awt.Dimension; 
import java.awt.Rectangle; 
import java.awt.image.BufferedImage; 
import javax.imageio.ImageIO; 
import java.io.File; 
import java.io.IOException; 
import java.awt.AWTException; 
import javax.swing.JScrollPane; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JFrame; 
import java.awt.FlowLayout; 
import java.awt.Image; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.BoxLayout; 
import java.awt.Container; 
import java.awt.GridLayout; 
import java.awt.BorderLayout; 
import java.awt.GridBagLayout; 




public class Ex3MF { 

    JFrame jframe = new JFrame("Crappy Screen Grabber 1.0"); 
    ImageIcon icon = new ImageIcon(this.getClass().getClassLoader().getResource("screenshot-ex3mf.png")); 
    JLabel jl; 
    JScrollPane jsp; 
    Container c = jframe.getContentPane(); 
    JButton button1 = new JButton("Resize Image"); 
    static Ex3MF e; 
    static Toolkit t = Toolkit.getDefaultToolkit(); 
    static Dimension d = t.getScreenSize(); 
    static int x_width = d.width/2; 
    static int x_height = d.width/2; 
    JPanel p1 = new JPanel(); 
    JPanel p2 = new JPanel(); 


    void setupJFrame() { 
     jframe.setSize(300, 300); 
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jframe.setLocationRelativeTo(null); 
     button1.addActionListener(new TrimImage()); 
     p2.setSize(200,100); 
     //p2.setLayout(new BorderLayout()); 
     p2.add(button1); 
     jframe.add(p2, BorderLayout.NORTH); 


    } 

    void image2ScrollPane(ImageIcon ic) { 
     setupJFrame(); 
     p1.setSize(3000,3000); 
     p1.setLayout(new BorderLayout()); 

     if (jl == null) { 
      jl = new JLabel("Crappy Screencapture", ic, JLabel.CENTER); 
     } else { 
      jl.setIcon(ic); 
     } 
     if (jsp == null) { 
      jsp = new JScrollPane(jl); 
     } else { 
      jsp.setViewportView(jl); 
     } 
     p1.add(jsp); 
     //c.add(p1); 

     //p1.add(jl); //and the jlabel to the panel 
    // jsp = new JScrollPane(p1); //and the panel to the ScrollPane 

    // c.add(jsp); //add the JScrollPane to the Container 

     jframe.add(p1, BorderLayout.CENTER); 
     jframe.setVisible(true); 
     jframe.pack(); 


    } 

    void createScreenCapture() { 
     try { 
      Robot ro = new Robot(); 
      Toolkit t = Toolkit.getDefaultToolkit(); 
      final Dimension d = t.getScreenSize(); 
      Rectangle re = new Rectangle(d.width, d.height); 
      BufferedImage image = ro.createScreenCapture(re); 


      //write screen capture to disk 
      ImageIO.write(image, "png", new File("screenshot-ex3mf.png")); 
     } catch(IOException ioe) { 
      System.out.println("IOException thrown " + ioe); 
     } 
     catch(AWTException awte) { 
      System.out.println("AWTException thrown " + awte); 
     } 



    } 

    ImageIcon resizeTheCapture() { 

     Image image = icon.getImage(); 
     x_width = x_width/2; 
     x_height = x_height/2; 

     Image newimg = image.getScaledInstance((x_width), (x_height), java.awt.Image.SCALE_SMOOTH); 
     return new ImageIcon(newimg); 


    } 

    public static void main(String[] args) { 
     e = new Ex3MF(); 
     e.createScreenCapture(); 
     e.image2ScrollPane(e.icon); 


     System.out.println("\nProgram complete..."); 

    } 


} //end class 

ボタンを制御するコードはこの文の後に続きます。

package Ex3; 

import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 


public class TrimImage implements ActionListener { 

    public void actionPerformed(ActionEvent ae) { 
     Ex3MF ex3 = new Ex3MF(); 
     ex3.e.image2ScrollPane(ex3.e.resizeTheCapture()); 

    } 


} 

ありがとうございました。私は与えられた迷惑なsnobbyのコメントや、私がより良いプログラマーや世界中の他の人たちに、自分の好きな検索エンジンで検索した後、これを読んでいるプログラマーになるための実際の助けに感謝します。 :)

+2

すぐに役立つように、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。つまり、1つのコピー/ペースト、余分なインポート、プレースホルダーコンポーネントで画像を取り除く必要があります。しかし、イメージを使用する必要がある場合。例のイメージを取得する1つの方法は、[このQ&A](http://stackoverflow.com/q/19209650/418556)に表示されているイメージにホットリンクすることです。 –

答えて

0

あなたのJScrollPaneは、その内容のサイズと一致します。 JScrollPane内のイメージがJScrollPaneよりも小さい場合、スクロールバーは必要ありません。 JScrollPaneをスクロールさせるために画像のサイズを大きくすることをお勧めします。

BufferedImageのサイズを指定できます。 BufferedImageに画像を描画する方法の例として、BufferedImages hereを読んで、thisを使用してください。

+0

@eightrazzさん、ありがとうございます。私はチャンスがあるときにこれを試してみる。 :)スクロールバーは、イメージがJScrollPaneのサイズを超えている場合にのみ表示されるというのは正しいと思います。私は、画像を縮小するときにJScrollPaneのサイズをプログラムで縮小して、アイコンサイズの画像にスクロールバーを表示させることができますが、実用的ではないことは明らかです。 – user3870315

関連する問題