2011-07-07 51 views
1

我有一個擴展JPanel的類,它放在JScrollPane中。從代碼中可以看到,我使用鼠標滾輪放大和縮小面板,效果非常好。但是如何讓ScrollPane相應地調整自己?我重寫了JPanel的getPreferredSize(),它認爲它被JScrollPane用來調整它的大小。但是現在當我運行該程序時,我可以縮放所有內容,但不顯示滾動窗格。僅供參考,我有一個JFrame,其中包含JScrollPane。從JFrame創建上面顯示的SimPanel類的對象,並將其添加到JscrollPane中。根據其中的JPanel調整JScrollPane

編輯: * 下面的類放在一起將編譯和運行,並顯示問題。 *

以下是JFrame類:

package gui; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.AdjustmentEvent; 
import java.awt.event.AdjustmentListener; 


import javax.swing.JFrame; 
import javax.swing.JScrollBar; 

public class MyJFrame extends JFrame{ 
    private javax.swing.JButton jButton1; 
    private javax.swing.JButton jButton2; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JLabel jLabel2; 
    private javax.swing.JMenu jMenu1; 
    private javax.swing.JMenu jMenu2; 
    private javax.swing.JMenuBar jMenuBar1; 
    private javax.swing.JPanel jPanel1; 
    private javax.swing.JPanel jPanel2; 
    private javax.swing.JScrollPane jScrollPane1; 
    private javax.swing.JTextField jTextField1; 
    private javax.swing.JTextField jTextField2; 
    public MyJFrame() { 
     initComponents(); 
    } 
    private void initComponents() { 

     jPanel1 = new javax.swing.JPanel(); 
     jTextField1 = new javax.swing.JTextField(); 
     jLabel1 = new javax.swing.JLabel(); 
     jLabel2 = new javax.swing.JLabel(); 
     jTextField2 = new javax.swing.JTextField(); 
     jButton1 = new javax.swing.JButton(); 
     jButton2 = new javax.swing.JButton(); 
     jScrollPane1 = new javax.swing.JScrollPane();   
     jPanel2 = new SimPanel(jScrollPane1.getViewportBorderBounds().getHeight(),jScrollPane1.getViewportBorderBounds().getWidth()); 
     jMenuBar1 = new javax.swing.JMenuBar(); 
     jMenu1 = new javax.swing.JMenu(); 
     jMenu2 = new javax.swing.JMenu(); 
     JScrollBar hScrollBar; 
     JScrollBar vScrollBar; 
     final SwingWorker worker = new SwingWorker() { 
       public Object construct() { 
        for(;;){           
         repaint(); 
        } 
       }    
      }; 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jLabel1.setText(""); 

     jLabel2.setText(""); 

     jButton1.setText("START"); 

     jButton2.setText("USELESS"); 

     jButton1.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent ae){ 
       worker.start();    
       repaint();    
      } 
     }); 
     jButton2.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent ae){   
       repaint();    
      } 
     }); 
     hScrollBar=jScrollPane1.getHorizontalScrollBar(); 
     vScrollBar=jScrollPane1.getVerticalScrollBar(); 

     hScrollBar.addAdjustmentListener(new AdjustmentListener(){ 
      public void adjustmentValueChanged(AdjustmentEvent ae1){ 
       repaint(); 
      } 
     }); 
     vScrollBar.addAdjustmentListener(new AdjustmentListener(){ 
      public void adjustmentValueChanged(AdjustmentEvent ae2){ 
       repaint(); 
      } 
     }); 

     javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 
     jPanel1.setLayout(jPanel1Layout); 
     jPanel1Layout.setHorizontalGroup(
      jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(jPanel1Layout.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addComponent(jLabel1) 
        .addComponent(jLabel2)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) 
        .addComponent(jTextField2) 
        .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 51, Short.MAX_VALUE)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
       .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addComponent(jButton1) 
        .addComponent(jButton2)) 
       .addContainerGap(14, Short.MAX_VALUE)) 
     ); 
     jPanel1Layout.setVerticalGroup(
      jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(jPanel1Layout.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(jLabel1) 
        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(jButton1)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(jLabel2) 
        .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(jButton2)) 
       .addContainerGap(568, Short.MAX_VALUE)) 
     ); 

     jPanel2.setPreferredSize(new java.awt.Dimension(5000, 5000)); 

     javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); 
     jPanel2.setLayout(jPanel2Layout); 
     jPanel2Layout.setHorizontalGroup(
      jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 5000, Short.MAX_VALUE) 
     ); 
     jPanel2Layout.setVerticalGroup(
      jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 5000, Short.MAX_VALUE) 
     ); 

     jScrollPane1.setViewportView(jPanel2); 

     jMenu1.setText("File"); 
     jMenuBar1.add(jMenu1); 

     jMenu2.setText("Edit"); 
     jMenuBar1.add(jMenu2); 

     setJMenuBar(jMenuBar1); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 858, Short.MAX_VALUE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
      .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 631, Short.MAX_VALUE) 
     ); 

     pack(); 
    } 

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new MyJFrame().setVisible(true); 
      } 
     }); 
    } 
} 

而下面的SimPanel類:

package gui; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.MouseWheelEvent; 
import java.awt.event.MouseWheelListener; 
import java.util.Random; 

import javax.swing.JPanel; 

public class SimPanel extends JPanel implements MouseWheelListener{ 
    Dimension area; 
    double height,width; 
    double scale=0.5; 
    private static Random rand=new Random(); 
    public SimPanel(double h, double w) {  
     height=h; 
     width=w; 
     addMouseWheelListener(this); 
    } 
    protected void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     Graphics2D g2d; 
     g2d=(Graphics2D)g.create(); 
     g2d.translate(width/2, height/2); 
     g2d.scale(scale, scale); 
     g2d.translate(-width/2, -height/2); 
     g2d.setColor(Color.GREEN); 
     g2d.drawLine(5000, 0, 5000, 5000); 
     g2d.drawLine(0, 5000, 5000, 5000); 
     g2d.drawLine(0, 0, 0, 5000); 
     g2d.drawLine(0, 0, 5000, 0); 
     area=new Dimension((int)width,(int)height);  
     for(int i=0;i<100;i++){ 
      g2d.fillRect(rand.nextInt(5000), rand.nextInt(5000), 100, 100);   
     } 
     g2d.setColor(Color.RED); 
     for(int i=0;i<100;i++){ 
      g2d.fillRect(rand.nextInt(5000), rand.nextInt(5000), 100, 100); 
     } 
     g2d.dispose(); 
    } 
    /*@Override 
    public Dimension getPreferredSize(){ 
     return new Dimension((int)(width*scale) , (int)(height*scale)); 
    }*/ 
    @Override 
    public void mouseWheelMoved(MouseWheelEvent e) { 
     if(e.getWheelRotation()<0){ 
      scale=scale>=1.0?1.0:scale+0.05; 
     } 
     else if(e.getWheelRotation()>0){ 
      scale=scale<=0.1?0.1:scale-0.05; 
     } 
     repaint(); 
    } 
} 

你可以從這裏得到的擺動工人階級: http://java.sun.com/products/jfc/tsc/articles/threads/src/SwingWorker.java

+1

請提供[sscce](http://sscce.org/)。 – trashgod

+0

@trashgod我按問題進行了更新,提供了一個簡短的,自包含的示例,它顯示了問題。它將編譯並運行。 – aps

+0

您不需要'javax.swing.SwingUtilities.SwingWorker'。 – trashgod

回答

1

您的面板需要實現Scrollable。我總是忘了什麼就在滾動每種方法設置的具體細節,但我想你想getPreferredScrollableViewportSize在任何給定時間內返回的,你想看到什麼樣的尺寸

1

你可以嘗試添加:

revalidate(); 
repaint(); 

當你改變比例。否則,我不認爲該scrollpane知道該面板已更改。

如果您需要更多幫助發佈您的SSCCE。

編輯:

這不是一個SSCCE!菜單與滾輪問題有什麼關係?按鈕和文本字段與問題有什麼關係?只發布與問題相關的代碼,我們沒有時間查看不必要的代碼。

我建議您添加的revalidate()代碼在哪裏?

爲什麼要註釋掉getPreferredSize()方法?如果您希望滾動條按需顯示,則需要更改首選大小。

您的代碼的問題是首選大小沒有意義。當我測試它時,寬度爲-3。所以你創建SimPanel的代碼是錯誤的。我將值300和300分別作爲SimPanel的參數。我也用:

 if(e.getWheelRotation()<0){ 
//   scale=scale>=1.0?1.0:scale+0.05; 
      scale += 0.05; 
     } 
     else if(e.getWheelRotation()>0){ 
//   scale=scale<=0.1?0.1:scale-0.05; 
      scale -= -0.05; 
     } 

爲我的快速測試,它工作正常。

+0

我已更新了問題以提供一個簡短的自我包含顯示問題的例子,它會編譯並運行。 – aps

+0

@aps,請參閱編輯。 – camickr

+0

實際上我減少了很多代碼,但仍然保留了一些不必要的代碼。對不起。我曾使用過revalidate();但它似乎沒有任何區別。無論如何,我會再次嘗試與您的上述建議。你在getPreferredSize()中使用了什麼? – aps