我有一个相当简单的视图类,我正在构建它。我边走边测试,所以代码远未完成。但是,当我测试时,一切看起来都很好,直到我滚动。如果我通过单击滚动条上的开放区域一次滚动页面,一切都很好。如果我使用滚动箭头、拖动滚动条或使用鼠标滚轮,新显示的内容将完全被破坏。1.6.35 和 1.7.09 都会出现这种情况。当我单击并拖动作为 JTextField 的“日志行”时,我还注意到了重整。请告诉我我在这里做错了什么。代码应该按原样运行。
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("");
}
});
}
}