0

私は構築中のかなり単純なビュークラスを持っています。進行中にテストを行うため、コードは完全にはほど遠いです。ただし、テストすると、スクロールするまではすべて問題ないように見えます。スクロールバーの空き領域をクリックして一度にページをスクロールすると、すべて問題ありません。スクロール矢印を使用したり、スクロール バーをドラッグしたり、マウス ホイールを使用したりすると、新しく表示されたコンテンツが完全に壊れてしまいます。これは、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("");
            }
        });
    }
}
4

2 に答える 2

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

それがあなたの問題だと思います。透明色の背景を設定する場合は注意してください。これが問題である理由を理解するには、透明度のある背景を参照してください。

あなたの場合(完全な透明性を使用しているため)、次を使用できます。

setOpaque( false );
于 2013-03-12T16:07:24.223 に答える
0

男、それは奇妙な見た目です。

もう少し情報を探している人のために:テキストパネルをスクロールするとき、スクロールパネル内のパネルの内容はそれらの完全性を維持しません。文字の行の一部は、元の文字が下にスクロールしている間、後ろに残り、少し「溶けた」ように見えます。言い換えれば、「マングリング」はテキストをマングリングすることを意味するのではなく、マングルされるのは画像を構成するピクセルです。

GridBagなしでスクロールパネル内にパネルを作成してみます。私はGridBagにそれほど精通していません、私はそれが不快であると感じて、これまでほとんどそれなしでやることができました。ただし、内部パネルの構造は非常に単純なので、必要ありません。左上に画像、次にテキスト行、次に別の画像、次に別のテキスト行があるように見えます。各行に1つずつ、合計2つのJPanelを作成します。フローレイアウトと水平方向を使用して、そこに画像とテキストを貼り付けるだけです。次に、水平レイアウトして2つのJPanelをパネルに貼り付けると、パネルを追加できます。スクロールパネル。

それで問題が解決するかどうかはわかりませんが、以前に行ったこととは異なるように見えるコードの唯一のものはGridBagであり、この動作はありませんでした。そして、私はGridBagを使いこなせず、何が悪いのかをすばやく理解できません。

于 2013-03-12T15:58:28.670 に答える