2012-07-26 51 views
1

我使用一個邊界佈局,這似乎是躲在JScrollPane中舉行的JTextPane,這是在該中心。我如何強制中心JScrollPane顯示?BorderLayout的隱藏JPane

package net.bounceme.dur.usenet.swing; 

import java.util.Observable; 
import java.util.Observer; 
import java.util.logging.Logger; 
import javax.mail.Folder; 
import javax.swing.ListModel; 
import net.bounceme.dur.usenet.controller.Controller; 
import net.bounceme.dur.usenet.controller.MessageBean; 
import net.bounceme.dur.usenet.controller.MessagesDefaultListModel; 

public class MessageSelect extends javax.swing.JPanel implements Observer { 

    private static final Logger LOG = Logger.getLogger(MessageSelect.class.getName()); 
    private Controller controller = Controller.getInstance(); 
    private ListModel messages = new MessagesDefaultListModel(); 
    private MessageBean messageBean = new MessageBean(); 

    public MessageSelect() { 
     controller.addObserver(this); 
     initComponents(); 
     messageContent.setText("hello world"); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     center = new javax.swing.JScrollPane(); 
     messageContent = new javax.swing.JTextPane(); 
     south = new javax.swing.JPanel(); 
     commentJButton = new javax.swing.JButton(); 
     west = new javax.swing.JScrollPane(); 
     messagesJList = new javax.swing.JList(); 

     setLayout(new java.awt.BorderLayout()); 

     messageContent.setContentType("text/html"); // NOI18N 
     center.setViewportView(messageContent); 

     add(center, java.awt.BorderLayout.CENTER); 

     south.setLayout(new java.awt.BorderLayout()); 

     commentJButton.setText("comment"); 
     commentJButton.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       commentJButtonActionPerformed(evt); 
      } 
     }); 
     south.add(commentJButton, java.awt.BorderLayout.CENTER); 

     add(south, java.awt.BorderLayout.SOUTH); 

     messagesJList.setModel(new javax.swing.AbstractListModel() { 
      String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" }; 
      public int getSize() { return strings.length; } 
      public Object getElementAt(int i) { return strings[i]; } 
     }); 
     messagesJList.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseReleased(java.awt.event.MouseEvent evt) { 
       messagesJListMouseReleased(evt); 
      } 
     }); 
     messagesJList.addKeyListener(new java.awt.event.KeyAdapter() { 
      public void keyReleased(java.awt.event.KeyEvent evt) { 
       messagesJListKeyReleased(evt); 
      } 
     }); 
     west.setViewportView(messagesJList); 

     add(west, java.awt.BorderLayout.WEST); 
    }// </editor-fold> 

    private void commentJButtonActionPerformed(java.awt.event.ActionEvent evt) {            
     LOG.fine("button clicked" + messageBean); 
    }            

    private void messagesJListKeyReleased(java.awt.event.KeyEvent evt) {           
     userSelectedRow(); 
    }           

    private void messagesJListMouseReleased(java.awt.event.MouseEvent evt) {            
     userSelectedRow(); 
    }           
    // Variables declaration - do not modify 
    private javax.swing.JScrollPane center; 
    private javax.swing.JButton commentJButton; 
    private javax.swing.JTextPane messageContent; 
    private javax.swing.JList messagesJList; 
    private javax.swing.JPanel south; 
    private javax.swing.JScrollPane west; 
    // End of variables declaration 

    @Override 
    @SuppressWarnings("unchecked") 
    public void update(Observable o, Object arg) { 
     LOG.fine("trying folder: " + arg); 
     //Folder folder = null; 
     try { 
      Folder folder = (Folder) arg; 
      messages = new MessagesDefaultListModel(folder); 
      LOG.fine("how many messages? " + messages.getSize()); 
      messagesJList.setModel(messages); 
      LOG.fine("loaded messages.."); 
     } catch (Exception e) { //err, class cast exception? 
      LOG.fine("not a valid folder " + arg); 
     } 
    } 

    private void userSelectedRow() { 
     messageBean = (MessageBean) messagesJList.getSelectedValue(); 
     LOG.fine(messageBean.toString()); 
     messageContent.setText(messageBean.getContent()); 
     LOG.fine("..gotMessageBean: " + messageBean); 
    } 
} 

第一選項卡下允許USENET組的選擇,一些基團更好的表現,其他人。而Android組是獨特的,常規大小的窗口不顯示CENTER JScrollPane的:

enter image description here

但最大化窗口允許中心JScrollPane中正確顯示:

enter image description here

+0

我有沒有問題。確保你在主框架上打電話包(如果你沒有指定尺寸)。如果你得到真正卡住,嘗試設置'scrollPane'的'preferredSize'財產 – MadProgrammer 2012-07-26 04:22:07

+0

是的,我已經試過與JScrollPane的最小尺寸打,但我也來看看首選大小。有時,最大化Java窗口將允許CENTER JScrollPane顯示,但這是100%。 – Thufir 2012-07-26 04:23:50

+0

'BorderLayout'並不關心最大/最小尺寸。在我的測試中,設置'preferredSize'對佈局做了明顯的改變。 – MadProgrammer 2012-07-26 04:28:09

回答

2

我認爲這就是JList的規模正在排到最長的一排。嘗試

messageList.setPrototypeCellValue("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); 

建立寬度。您還可以嘗試設置JScrollPane的首選寬度,該寬度包含JList並啓用水平滾動。

+0

非常奇怪。該字符串工作正常,但通常你會發送一個維或類似的?奧術解決方案的獎勵積分;) – Thufir 2012-07-26 04:55:01

+1

它實際上並不奇怪。它的關閉自動寬度計算的標準方法:http://docs.oracle.com/javase/6/docs/api/javax/swing/JList.html想法是設置寬度在自然變化的方式內容字體發生變化。您可以通過創建自己的'CellRenderer'子類來編寫硬件寬度。 – Gene 2012-07-26 15:09:52