2016-08-16 2 views
0

Я пытаюсь заставить JScrollPane постоянно прокручиваться в этой программе. Я также пытаюсь заставить это прокручивать, даже когда изображение сжимается после нажатия кнопки. Я могу заставить панель прокрутки прокручиваться только тогда, когда JFrame максимизируется. Также после того, как изображение внутри JScrollPane уменьшается наполовину при нажатии на кнопку, JScrollPane больше не появляется. Я думал, что у JScrollPane всегда есть горизонтальная и вертикальная полосы прокрутки, делая панель, которая держит ее намного больше, чем JFrame, в котором находится панель. Пожалуйста, см. Код ниже и, если возможно, помогите отладить его.Как получить прокрутку области 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] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). Это означает, что она должна быть одной копией/пастой, избыточным импортом и не учитывать изображения с помощью компонента-заполнителя. Но если вы должны использовать изображения. Один из способов получить изображение (-ы) для примера - это горячая ссылка на изображения, видимые в [этом вопросе & ответа] (http://stackoverflow.com/q/19209650/418556). –

ответ

0

Ваш JScrollPane будет соответствовать размеру его содержимого. Если ваше изображение в JScrollPane меньше вашего JScrollPane, тогда полосы прокрутки не нужны. Я советую вам увеличить размер вашего изображения, чтобы заставить прокручивать JScrollPane.

Вы можете указать размер BufferedImage. Читайте о BufferedImages here и используйте this как пример того, как нарисовать изображение на BufferedImage.

+0

Спасибо за ответ @eightrazz. Я попробую это, когда у меня появится шанс. :) Я думаю, вы правы, что полосы прокрутки появляются только тогда, когда изображение превышает размер JScrollPane. Я думаю, что я хочу программно уменьшить размер JScrollPane, когда я сжимаю изображение, поэтому у меня могут быть полосы прокрутки на изображениях значков только для удовольствия, но, очевидно, не для практических целей. – user3870315

Смежные вопросы