2013-03-12 39 views
0

我有一個相當簡單的視圖類,我正在構建過程中。我測試,因爲我去,所以代碼是很不完整的。但是,當我測試時,一切都很好,直到我滾動。如果通過單擊滾動條上的空白區域一次滾動頁面,則一切正常。如果我使用滾動箭頭,拖動滾動條或使用鼠標滾輪,則新顯示的內容將完全損壞。這發生在1.6.35和1.7.09兩者。當我點擊並拖動「日誌行」(這是一個JTextField)時,我也注意到了這種情況。請告訴我我在這裏做錯了什麼。代碼應該按原樣運行。JScrollPane整理內容

package com.mycompany.utility.logs; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JSplitPane; 
import javax.swing.JTextField; 
import javax.swing.JTextPane; 
import javax.swing.ScrollPaneConstants; 
import javax.swing.border.EmptyBorder; 

/** 
* This class implements the log viewer view. 
*/ 
public class LogViewer extends JFrame 
{ 
    private static final long serialVersionUID = 1L; 
    private static final Color TRANSPARENT = new Color(255, 255, 255, 0); 
    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() 
      { 
       try 
       { 
        LogViewer frame = new LogViewer(); 
        frame.setVisible(true); 
       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the view. 
    */ 
    public LogViewer() 
    { 
     GridBagConstraints gridBagConstraints = null; 
     int row = 0; 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 713, 684); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     JPanel topPanel = new JPanel(); 
     contentPane.add(topPanel, BorderLayout.NORTH); 
     GridBagLayout gbl_topPanel = new GridBagLayout(); 
     gbl_topPanel.columnWidths = new int[] { 0 }; 
     gbl_topPanel.rowHeights = new int[] { 0 }; 
     gbl_topPanel.columnWeights = new double[] { Double.MIN_VALUE }; 
     gbl_topPanel.rowWeights = new double[] { Double.MIN_VALUE }; 
     topPanel.setLayout(gbl_topPanel); 

     JLabel titleLabel = new JLabel("Tattle Tail Log Viewer"); 
     titleLabel.setFont(new Font("Lucida Sans", Font.BOLD, 12)); 
     gridBagConstraints = new GridBagConstraints(); 
     gridBagConstraints.gridy = 0; 
     gridBagConstraints.gridx = 0; 
     topPanel.add(titleLabel, gridBagConstraints); 

     JPanel bottomPanel = new JPanel(); 
     contentPane.add(bottomPanel, BorderLayout.SOUTH); 

     JSplitPane splitPane = new JSplitPane(); 
     splitPane.setResizeWeight(0.75); 
     splitPane.setOneTouchExpandable(true); 
     splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); 
     contentPane.add(splitPane, BorderLayout.CENTER); 

     JPanel scrollPanel = new JPanel(); 
     scrollPanel.setBackground(Color.WHITE); 
     scrollPanel.setLayout(new GridBagLayout()); 

     JScrollPane scrollPane = new JScrollPane(); 
     scrollPane.setViewportView(scrollPanel); 
     scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
     splitPane.setLeftComponent(scrollPane); 

     final JTextPane textPane = new JTextPane(); 
     splitPane.setRightComponent(textPane); 
     textPane.setFont(new Font("Courier New", Font.PLAIN, 11)); 

     for (int i = 0; i < 25; i++) 
     { 
      addLogEntry(scrollPanel, textPane, row, 
        "2013-03-11 15:40:19,123 INFO com.mycompany.business.logic.ImportantProcess", 
        "Something of which you need to be aware happened " + i + "."); 
      row++; 
     } 

     JPanel fillPanel = new JPanel(); 
     fillPanel.setBackground(Color.LIGHT_GRAY); 
     gridBagConstraints = new GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = row; 
     gridBagConstraints.gridwidth = 2; 
     gridBagConstraints.weighty = 1D; 
     gridBagConstraints.fill = GridBagConstraints.BOTH; 
     scrollPanel.add(fillPanel, gridBagConstraints); 
    } 

    private void addLogEntry(final JPanel scrollPanel, final JTextPane textPane, final int row, final String logText, 
      final String messageText) 
    { 
     GridBagConstraints gridBagConstraints = null; 

     JPanel entryPanel = new JPanel(); 
     entryPanel.setBackground(TRANSPARENT); 
     entryPanel.setLayout(new GridBagLayout()); 
     gridBagConstraints = new GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = row; 
     gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; 
     gridBagConstraints.weightx = 1D; 
     gridBagConstraints.weighty = 0D; 
     gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; 
     scrollPanel.add(entryPanel, gridBagConstraints); 

     JPanel logLinePanel = new JPanel(); 
     logLinePanel.setBackground(TRANSPARENT); 
     logLinePanel.setFocusable(true); 
     logLinePanel.setLayout(new GridBagLayout()); 
     gridBagConstraints = new GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = 0; 
     gridBagConstraints.weightx = 1D; 
     gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; 
     gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; 
     entryPanel.add(logLinePanel, gridBagConstraints); 

     JLabel logLineLevelLabel = new JLabel(" "); 
     logLineLevelLabel.setOpaque(true); 
     logLineLevelLabel.setBackground(new Color(0, 128, 0)); 
     logLineLevelLabel.setFont(new Font("Courier New", Font.BOLD, 11)); 
     gridBagConstraints = new GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = 0; 
     gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; 
     logLinePanel.add(logLineLevelLabel, gridBagConstraints); 

     JTextField logLineText = new JTextField(logText); 
     logLineText.setEditable(false); 
     logLineText.setBackground(TRANSPARENT); 
     logLineText.setBorder(null); 
     logLineText.setFont(new Font("Courier New", Font.PLAIN, 11)); 
     gridBagConstraints = new GridBagConstraints(); 
     gridBagConstraints.gridx = 1; 
     gridBagConstraints.gridy = 0; 
     gridBagConstraints.weightx = 1D; 
     gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; 
     gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; 
     logLinePanel.add(logLineText, gridBagConstraints); 

     JPanel messageLinePanel = new JPanel(); 
     messageLinePanel.setBackground(TRANSPARENT); 
     messageLinePanel.setLayout(new GridBagLayout()); 
     gridBagConstraints = new GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = 1; 
     gridBagConstraints.weightx = 1D; 
     gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; 
     gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; 
     entryPanel.add(messageLinePanel, gridBagConstraints); 

     JLabel hasMoreMessageLineLabel = new JLabel("+ "); 
     hasMoreMessageLineLabel.setFont(new Font("Courier New", Font.BOLD, 11)); 
     gridBagConstraints = new GridBagConstraints(); 
     gridBagConstraints.gridx = 0; 
     gridBagConstraints.gridy = 0; 
     gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; 
     messageLinePanel.add(hasMoreMessageLineLabel, gridBagConstraints); 

     JLabel messageLineLabel = new JLabel(messageText); 
     messageLineLabel.setBackground(TRANSPARENT); 
     messageLineLabel.setFocusable(true); 
     messageLineLabel.setFont(new Font("Courier New", Font.PLAIN, 11)); 
     gridBagConstraints = new GridBagConstraints(); 
     gridBagConstraints.gridx = 1; 
     gridBagConstraints.gridy = 0; 
     gridBagConstraints.weightx = 1D; 
     gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; 
     gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; 
     messageLinePanel.add(messageLineLabel, gridBagConstraints); 

     entryPanel.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseEntered(MouseEvent e) 
      { 
       final JPanel containerPanel = (JPanel) e.getComponent(); 
       final JPanel messagePanel = (JPanel) containerPanel.getComponent(1); 
       final JLabel messageLabel = (JLabel) messagePanel.getComponent(1); 
       String text = messageLabel.getText(); 
       textPane.setText(text); 
      } 

      @Override 
      public void mouseExited(MouseEvent e) 
      { 
       textPane.setText(""); 
      } 
     }); 
    } 
} 
+0

忘了提,Windows 7的專業版。 – Steve11235 2013-03-12 15:00:56

回答

3
private static final Color TRANSPARENT = new Color(255, 255, 255, 0); 

我想那是你的問題。使用透明色設置背景時要小心。瞭解爲什麼這是一個問題,請參見Backgrounds With Transparency

在你的情況(因爲你使用完全透明),你可以使用:

setOpaque(false); 
+0

這是有道理的。讓我嘗試改變它。如果有效,我會「接受」你的答案。謝謝! – Steve11235 2013-03-12 16:50:36

+0

哇..Camickr你有驚人的擺動動力學概念..雖然我從來沒有嘗試OP在他的代碼中完成的方式,但是今天我開始瞭解你的新概念...... !!! +1的.. – 2013-03-12 16:50:42

0

男人,這很奇怪。

對於需要更多信息的用戶:滾動文本面板時,滾動面板內的面板內容不會保持其完整性;字母部分的字母在原稿向下滾動時留下,使其看起來有點「融化」。換句話說,「損壞」並不意味着破壞文本,它是構成圖像的像素被破壞。

我會嘗試在沒有GridBag的情況下在滾動面板內製作面板。我對GridBag並不熟悉,我覺得它很不愉快,並且迄今爲止的管理大部分都沒有它。但你的內部面板的結構看起來很簡單,你也不需要它:看起來你有一個圖像左上角,然後是文本行,然後可能是另一個圖像,然後是另一行文本。製作兩個JPanel,每行一個,可以使用流佈局和水平方向,只需將圖像和文本粘貼在那裏,然後水平佈局並將兩個JPanel粘貼到面板中,現在您可以添加一個面板滾動面板。

我不知道這是否會解決問題,但GridBag是唯一從你的代碼看起來不同於我之前完成的事情沒有這種行爲。 GridBag很容易找出它可能會出錯的地方。

+0

加上一個用於描述發生的情況。結果看起來很融化。 – Steve11235 2013-03-12 16:49:46