Search code examples
javaswinguser-interfacejtextareanimbus

JTextArea on Nimbus being inconsistent across different machines


I have a class extending JPanel that I want to embed into a JFrame. The L&F is set to Nimbus, and the layout I'm using for the panel is a GridBagLayout.


When I gave the JAR to a friend, a JTextArea I intend to use as a log console started acting up and wouldn't stay the size I set it to.

textAreaLog.setMinimumSize(new Dimension(295, 48));

I'm using WinXP SP2, and my friend's using Win7 64-bit. Here's a picture of how it looks on my PC (left) and his PC (right):

Image

Obviously I intended it to be the way I have it on my machine.


Here's the relevant code (almost the whole class used for the panel):

package com.sassilization.mapfix.gui;

// Imports the package with the inner-workings of the application
import com.sassilization.mapfix.MapFixGenerator;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class LogPanel extends JPanel {
    private static final long serialVersionUID = 8324191587703173738L;

    /*
    * Constructor
    */
    public LogPanel() {
        setPreferredSize(new Dimension(350, 70));
        // Creates a default Nimbus border
        setBorder(BorderFactory.createTitledBorder((String) null));
        setOpaque(false);

        setLayout(new GridBagLayout());
        // Calls the method which initializes all the components
        initComponents();
    }

    /*
    * Component declarations
    */
    private JButton buttonFgd;
    private JButton buttonHelp;
    private JButton buttonLogCopy;
    private JButton buttonLogDown;
    private JButton buttonLogUp;
    private JTextArea textAreaLog;
    private JToggleButton toggleButtonAppend;

    /*
    * Initializes and adds all the components to the panel
    */
    private void initComponents() {
        // The constraints used to lay out the components in a GBL
        GridBagConstraints gbc = new GridBagConstraints();

        // The brick button
        toggleButtonAppend = new JToggleButton(appendIcons[0]);
        toggleButtonAppend.setBorder(BorderFactory.createEmptyBorder());
        toggleButtonAppend.setToolTipText("Turn append mode on");
        toggleButtonAppend.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent event) {
                buttonAppendItemStateChanged(event);
            }
        });
        add(toggleButtonAppend, gbc);

        // The question mark button
        buttonHelp = new JButton(new ImageIcon(getClass().getResource("resources/help.png")));
        buttonHelp.setBorder(BorderFactory.createEmptyBorder());
        buttonHelp.setToolTipText("Open help");
        buttonHelp.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                // buttonHelpActionPerformed(event);
            }
        });
        gbc.gridy = 1;
        add(buttonHelp, gbc);

        // The white page button
        buttonFgd = new JButton(new ImageIcon(getClass().getResource("resources/page_white_put.png")));
        buttonFgd.setBorder(BorderFactory.createEmptyBorder());
        buttonFgd.setToolTipText("Extract FGD file");
        buttonFgd.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                // buttonFgdActionPerformed(event);
            }
        });
        gbc.gridy = 2;
        add(buttonFgd, gbc);

        // The problematic JTextArea
        textAreaLog = new JTextArea();
        textAreaLog.setMinimumSize(new Dimension(295, 48));
        textAreaLog.setBorder(BorderFactory.createMatteBorder(0, 12, 0, 0,
                new ImageIcon(getClass().getResource("resources/border.png"))));
        textAreaLog.setBackground(new Color(0, 0, 0, 0));
        textAreaLog.setForeground(new Color(171, 193, 207));
        textAreaLog.setFont(new Font(null, Font.PLAIN, 9));
        textAreaLog.setLineWrap(true);
        textAreaLog.setWrapStyleWord(true);
        textAreaLog.setEditable(false);
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.gridheight = 3;
        add(textAreaLog, gbc);

        // The up arrow button
        buttonLogUp = new JButton(new ImageIcon(getClass().getResource("resources/bullet_arrow_up.png")));
        buttonLogUp.setBorder(BorderFactory.createEmptyBorder());
        buttonLogUp.setContentAreaFilled(false);
        buttonLogUp.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                // buttonLogUpActionPerformed(event);
            }
        });
        gbc.gridx = 2;
        gbc.gridheight = 1;
        add(buttonLogUp, gbc);

        // The floppy disk button
        buttonLogCopy = new JButton(new ImageIcon(getClass().getResource("resources/bullet_disk.png")));
        buttonLogCopy.setBorder(BorderFactory.createEmptyBorder());
        buttonLogCopy.setContentAreaFilled(false);
        buttonLogCopy.setToolTipText("Copy log to clipboard");
        buttonLogCopy.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                // buttonLogCopyActionPerformed(event);
            }
        });
        gbc.gridy = 1;
        add(buttonLogCopy, gbc);

        // The down arrow button
        buttonLogDown = new JButton(new ImageIcon(getClass().getResource("resources/bullet_arrow_down.png")));
        buttonLogDown.setBorder(BorderFactory.createEmptyBorder());
        buttonLogDown.setContentAreaFilled(false);
        buttonLogDown.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                // buttonLogDownActionPerformed(event);
            }
        });
        gbc.gridy = 2;
        add(buttonLogDown, gbc);
    }

    private ImageIcon appendIcons[] = { new ImageIcon(getClass().getResource("resources/brick.png")),
            new ImageIcon(getClass().getResource("resources/brick_add.png")) };

    /*
    * Event listener methods for the components go here.
    */
}

Furthermore, here's the main JFrame class which instantiates the LogPanel, albeit uncommented. Included is also a download link for the JAR.

Link


I'm using JPanel.setMinimumSize() so I can tame the JTextArea without using a JScrollPane. I'm thinking the display inconsistency has to do with this. If I do use a JScrollPane, it messes up the panel layout completely, so I'd rather stay away.

Thanks in advance.


EDIT 1:

If I change the L&F to the default or the system L&F, I get the same issue my friend did; therefore, it's most likely something to do with Nimbus itself.


EDIT 2:

It turns out there are differences in the Nimbus code between JDK6, which I was using, and JDK7. I have since updated and replaced the faulty code with setPreferredSize()—it works great now.


Solution

  • I've found a solution:

    It turns out there are differences in the Nimbus code between JDK6, which I was using, and JDK7. I have since updated and replaced the faulty code with setPreferredSize()—it works great now.