Question

I'm working an application that queries a database and pulls that information onto a couple of JPanels that I have added to a JFrame. Every 30 seconds I set one's visibility to false, and the other's to true in the JFrame to alternate which one displays.

The application works beautifully in Windows, but when I put it on my Ubuntu machine (Running XFCE and openjdk-7-jre), the panels don't show up. The other components in the JFrame do appear though, and I'm not sure what's going wrong. Again, the program runs correctly in Windows, but not Ubuntu.

I've tried to pare down my code to something that will compile and run by itself, but I know my code's a mess. I've done almost no Java programming, so I'm sorry for how ugly all of this is going to be! I also removed the database stuff, as that is working, and therefore unnecessary for y'all to see.

Thanks to anyone that can point me in the right direction!

package productivityDisplay;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Display implements ActionListener {

// Sizing constants
public boolean trimNames = false; // if true, trims to 10 characters (use
                                    // this if something is cut off)
int refreshRate = 600000; // Refresh rate for Data (milliseconds)
int margin = 2;
int labelHeight = 76;
Font defaultFont = new Font("Tahoma", Font.PLAIN, 50);
Color DodgerBlue = new Color(30, 144, 255);
Color OrangeRed = new Color(255, 69, 0);
Color DarkGreen = new Color(0, 100, 0);
// End Sizing constants

// Controls
private JLabel lblCountDown;
public int countDown;
private Timer refresh;
private JFrame frame;
private JLabel lblCurrTime;
private JPanel pnlGrind1, pnlGrind2;
private JLabel lblWeekSummary, lblRepairCredit,
        lblRepair2Count, lblCustom1, lblCustom2,
        lblQC, lblRepair, lblRepair2;
@SuppressWarnings("rawtypes")
private JComboBox cmbTeamNames;
// End Controls

// Data Variables
private int currentTeam;

// End Data Variables

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            try {
                Display window = new Display(1); // Attempts to show
                                                    // the
                                                    // window
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
                throw new Error("Yeah, it's broken.");
            }
        }
    });
}


public Display(int team) {
    initialize();
    cmbTeamNames.setSelectedIndex(team);
    getData();
}

/**
 * @wbp.parser.entryPoint
 */

@SuppressWarnings({ "unchecked", "rawtypes" })
private void initialize() {
    frame = new JFrame();

    frame.setVisible(true);
    frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH); // Maximize
                                                                                // Window
    int width = frame.getWidth();
    int height = frame.getHeight();
    //frame.setResizable(true); // Can't be resized
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setLayout(null);

 // MASSIVE CHUNK OF LAYOUT CODE //

    String[] strTeamNames = { "", "Grinding", "Finishing" };
    cmbTeamNames = new JComboBox(strTeamNames); // Combo Box (Grinding,
                                                // finishing) 
    cmbTeamNames.setFont(new Font("Tahoma", Font.PLAIN, 40));
    cmbTeamNames.setBounds(20, 11, 297, 67);
    frame.getContentPane().add(cmbTeamNames);
    cmbTeamNames.setName("cmbTeamNames");
    cmbTeamNames.addActionListener(this);

    lblCurrTime = new JLabel("Clock");
    lblCurrTime.setFont(new Font("Tahoma", Font.PLAIN, 99));
    lblCurrTime.setBounds((width - 350), 11, 300, 100);
    frame.getContentPane().add(lblCurrTime);
    countDown = 0;
    lblCountDown = new JLabel("Next update in: "+countDown);
    lblCountDown.setFont(new Font("Tahoma", Font.PLAIN, 40));
    lblCountDown.setBounds(cmbTeamNames.getX() + cmbTeamNames.getWidth()
            + 40, 20, 400, 50);
    frame.getContentPane().add(lblCountDown);

    // Grinding Layout 2

    pnlGrind2 = new JPanel();
    pnlGrind2.setBounds(20, 89, (width - 50), height - 130);
    frame.getContentPane().add(pnlGrind2);
    pnlGrind2.setLayout(null);
    pnlGrind2.setBorder(BorderFactory.createLineBorder (Color.blue, 2));
    // Column1

    JSeparator separator = new JSeparator();
    separator.setBounds(0, (labelHeight + margin - 1), 300, 10);
    pnlGrind2.add(separator);
    // End Column1
    // Column2
    int leftSet = 450;

    JSeparator separator2 = new JSeparator();
    separator2.setBounds(leftSet, (labelHeight + margin - 1), 200, 10);
    pnlGrind2.add(separator2);

    // End Column2
    // Column3
    leftSet = 750;

    JSeparator separator3 = new JSeparator();
    separator3.setBounds(leftSet, (labelHeight + margin - 1), 200, 10);
    pnlGrind2.add(separator3);

    // End Column3
    // Bottom rows

    lblRepair2 = new JLabel("Repair Credit:");

    pnlGrind2.add(lblRepair2);
    lblRepair2.setFont(defaultFont);
    lblRepair2.setForeground(DodgerBlue);
    lblRepair2Count = new JLabel("");
    lblRepair2Count.setBounds(lblRepair2.getX() + lblRepair2.getWidth()
            + margin, lblRepair2.getY(), 515, labelHeight);
    pnlGrind2.add(lblRepair2Count);
    lblRepair2Count.setFont(defaultFont);
    lblRepair2Count.setForeground(DodgerBlue);

    // End Bottom rows
    pnlGrind2.setVisible(false);
    pnlGrind2.setBackground(new Color(0, 0, 204)); // Used to see panel
    // better

    // End Grinding Layout 2

    // Grinding Layout 1

    pnlGrind1 = new JPanel();
    pnlGrind1.setBounds(20, 89, (width - 50), height - 130);
    frame.getContentPane().add(pnlGrind1);
    pnlGrind1.setLayout(null);
    pnlGrind1.setBorder(BorderFactory.createLineBorder (Color.blue, 2));
    pnlGrind1.setVisible(false);
    pnlGrind1.setBackground(new Color(255, 0, 204)); // Used to see panel
    // better

    // Left Side
    lblWeekSummary = new JLabel("Week Summary (Measured at Buffing)");
    lblWeekSummary.setBounds(0, 0, 515, 37);
    pnlGrind1.add(lblWeekSummary);
    lblWeekSummary.setFont(new Font("Tahoma", Font.PLAIN, 30));
    // Spacing
    lblCustom1 = new JLabel("Custom:");
    lblCustom1.setBounds(0,
            lblWeekSummary.getY() + (lblWeekSummary.getHeight() + margin)
                    * 2, 515, labelHeight);
    pnlGrind1.add(lblCustom1);
    lblCustom1.setFont(defaultFont);
    lblCustom1.setForeground(OrangeRed);

    lblRepairCredit = new JLabel("Repair Credit:");
    lblRepairCredit.setBounds(0,
            lblCustom1.getY() + (lblCustom1.getHeight() + margin), 515,
            labelHeight);
    pnlGrind1.add(lblRepairCredit);
    lblRepairCredit.setFont(defaultFont);
    lblRepairCredit.setForeground(DodgerBlue);
    // Spacing
    lblQC = new JLabel("QC");
    lblQC.setBounds(
            0,
            (int) (lblRepairCredit.getY() + (lblRepairCredit.getHeight() + margin) * 1.5),
            515, labelHeight);
    pnlGrind1.add(lblQC);
    lblQC.setFont(defaultFont);
    lblQC.setForeground(DarkGreen);

    lblCustom2 = new JLabel("Custom:");
    lblCustom2.setBounds(0, lblQC.getY() + (lblQC.getHeight() + margin),
            515, labelHeight);
    pnlGrind1.add(lblCustom2);
    lblCustom2.setFont(defaultFont);
    lblCustom2.setForeground(DarkGreen);

    lblRepair = new JLabel("Repair:");
    lblRepair.setBounds(0, lblCustom2.getY()
            + (lblCustom2.getHeight() + margin), 515, labelHeight);
    pnlGrind1.add(lblRepair);
    lblRepair.setFont(defaultFont);
    lblRepair.setForeground(DarkGreen);
    // End Left Side

    // Right Side


    // End Right Side

    // End Grinding Layout 1
// END MASSIVE CHUNK OF LAYOUT CODE //
    frame.pack();
    frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH); // Maximize
    // Window
}

// Thread classes


public void getData() {
    ActionListener updateData = new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            pnlGrind1.repaint();
            pnlGrind2.repaint();
            countDown = 15;
        }
    };
    refresh = new Timer(refreshRate, updateData);
    refresh.start();

}

// End Thread Classes


public void actionPerformed(ActionEvent e) { // Combo box to select team was
                                                // clicked

    int team;
    team = cmbTeamNames.getSelectedIndex();
    currentTeam = team;
    countDown=600;
    int t2Interval = 5000;
    if (team == 1) { // Grinding team
        pnlGrind1.setVisible(true);
    }
    ActionListener alternatePnl = new ActionListener() {

        public void actionPerformed(ActionEvent evt) {
            // updateData();

            alternatePanel(cmbTeamNames.getSelectedIndex());

        }
    };
    new Timer(t2Interval, alternatePnl).start();

}


void alternatePanel(int team) {
    if (team == 1) { // If Grinding team
        if (pnlGrind1.isVisible()) {
            pnlGrind1.setVisible(false);
            pnlGrind2.setVisible(true);
        } else {
            pnlGrind2.setVisible(false);
            pnlGrind1.setVisible(true);
        }
    }

}

}

Was it helpful?

Solution

Because JPanels get the negative height and width:

pnlGrind2.setBounds(20, 89, (width - 50), height - 130);

, and width = height = 0 there. You have just initialized the JFrame so both 0 by default and you immediately assign these values to height and width.

If already to do absolute layout, be consistent and specify your frame size ASAP:

private void initialize() {
    frame = new JFrame();
    frame.setSize(800, 600);
    ...

After that JPanels appear on the screen on my Ubuntu machine.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top