I'm doing something wrong here: I want to have two JButtons in a JSplitPane in a JPanel in a a JFrame, where the buttons fill the JSplitPane.
Here's what I get when I resize the JFrame:
The buttons stay their normal size, and the JSplitPane doesn't allow adjusting.something
How do I fix this?
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import net.miginfocom.swing.MigLayout;
public class SplitPaneQuestion {
public static void main(String[] args) {
JFrame frame = new JFrame("SplitPaneQuestion");
JPanel panel = new JPanel();
frame.setContentPane(panel);
panel.setLayout(new MigLayout("","[]","[grow]"));
JSplitPane splitpane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
panel.add(splitpane, "");
splitpane.setTopComponent(new JButton("top"));
splitpane.setBottomComponent(new JButton("bottom"));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Add the "push" and "grow" contraints to your split pane, like this:
panel.add(splitpane, "push, grow");
Related
I am trying to make a RPG game in a GUI and it's not going so well.
Before I added the JButton everything worked and displayed in the window as it should. I'm not sure what happened after I added the JButton.
There is supposed to be the title displayed in the grey area and the button in the blue area. Ive tried running normally and running with debugger, none of the text or button shows up.
I am following the tutorial here step-by-step and I dont see anything out of place. (I know that i've changed the variable names).
What have I done wrong here? Do I need to add anything extra?
import javax.swing.*;
import java.awt.*;
public class Game {
JFrame window;
Container c;
JPanel titlePanel;
JPanel startButtonPanel;
JLabel titleLabel;
JButton startButton;
Font titleFont = new Font("Cooper Black", Font.PLAIN, 90);
Font buttonFont = new Font("Cooper Black", Font.PLAIN, 32);
public static void main(String[] args) {
new Game();
}
public Game() {
//Main Window
window = new JFrame();
window.setSize(800, 600);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().setBackground(Color.BLACK);
window.setLayout(null);
window.setVisible(true);
c = window.getContentPane();
//Title Panel
titlePanel = new JPanel();
titlePanel.setBounds(100, 100, 600, 150);
titlePanel.setBackground(Color.GRAY);
titleLabel = new JLabel("TEXT RPG");
titleLabel.setForeground(Color.WHITE);
titleLabel.setFont(titleFont);
//Start Button Panel
startButtonPanel = new JPanel();
startButtonPanel.setBounds(300, 400, 200, 100 );
startButtonPanel.setBackground(Color.BLUE);
//Start Button
startButton = new JButton("START");
startButton.setBackground(Color.BLACK);
startButton.setForeground(Color.WHITE);
startButton.setFont(buttonFont);
//Add Elements to Window
titlePanel.add(titleLabel);
startButtonPanel.add(startButton);
//Add Elements to Container
c.add(titlePanel);
c.add(startButtonPanel);
}
}
Do not follow tutorial teaching you to use null layout managers and setting bounds "manually". That is not a good practice.
Remove all bounds setting from the code.
Instead use Layout Managers, that is what they do, dynamically set bounds for you:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Game {
JFrame window;
Container c;
JPanel titlePanel;
JPanel startButtonPanel;
JLabel titleLabel;
JButton startButton;
Font titleFont = new Font("Cooper Black", Font.PLAIN, 90);
Font buttonFont = new Font("Cooper Black", Font.PLAIN, 32);
public static void main(String[] args) {
new Game();
}
public Game() {
//Main Window
window = new JFrame();
window.setSize(800, 600);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
c = window.getContentPane();
c.setBackground(Color.BLACK);
//window.setLayout(null);
//Title Panel
titlePanel = new JPanel(); //JPanel uses FlowLayout by default
//titlePanel.setBounds(100, 100, 600, 150)
titlePanel.setBackground(Color.GRAY);
titleLabel = new JLabel("TEXT RPG");
titleLabel.setForeground(Color.WHITE);
titleLabel.setFont(titleFont);
//Start Button Panel
startButtonPanel = new JPanel();
//startButtonPanel.setBounds(300, 400, 200, 100 );
startButtonPanel.setBackground(Color.BLUE);
//Start Button
startButton = new JButton("START");
startButton.setBackground(Color.BLACK);
startButton.setForeground(Color.WHITE);
startButton.setFont(buttonFont);
//Add Elements to Window
titlePanel.add(titleLabel);
startButtonPanel.add(startButton);
//Add Elements to Container
c.add(titlePanel, BorderLayout.CENTER); //JFrame content pane uses BorderLayout by default
c.add(startButtonPanel, BorderLayout.PAGE_END);
window.pack();
window.setVisible(true); //invoke after all added and pack() ed
}
}
Don't expect to get the exact desired look on first attempt. Learn how to use different Layout Managers and combinations of them to get what you want.
A friend of mine offfered to fix the problem. He added something called "extends Canvas".
Heres the fixed version:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Game extends Canvas{
private static final long serialVersionUID = 1L;
public static JFrame window;
public static Container c;
JPanel titlePanel,startButtonPanel;
JLabel titleLabel;
JButton startButton;
Font titleFont = new Font("Cooper Black", Font.PLAIN,90);
private static int width = 800;
private static int height = 600;
public static String title ="Blueberry's Game";
/*----------------------------------------------------------------------------------------------------*/
public static void main(String[] args){
Game game = new Game();
Game.window.setResizable(false);
Game.window.setTitle(Game.title);
Game.window.add(game);
Game.window.pack();
Game.window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Game.window.setLocationRelativeTo(null);
Game.window.setVisible(true);
}
/*----------------------------------------------------------------------------------------------------*/
public Game(){
window = new JFrame();
setPreferredSize(new Dimension(width, height));
window.getContentPane().setBackground(Color.BLACK);
c = window.getContentPane();
//////////TITLE PANEL//////////////////////
titlePanel = new JPanel();
titlePanel.setBounds(100, 100, 600, 150);
titlePanel.setBackground(Color.BLACK);
titleLabel = new JLabel("TEXT RPG");
titleLabel.setForeground(Color.WHITE);
titleLabel.setFont(titleFont);
//////////START BUTTON PANEL//////////////////////
startButtonPanel = new JPanel();
startButtonPanel.setBounds(300, 400, 200, 100);
startButtonPanel.setForeground(Color.BLUE);
//////////START BUTTON//////////////////////
startButton = new JButton("START");
startButton.setBackground(Color.BLACK);
startButton.setForeground(Color.WHITE);
//////////ADD ELEMENTS TO WINDOW//////////////////////
titlePanel.add(titleLabel);
startButtonPanel.add(startButton);
//////////ADD ELEMENTS TO CONTAINER//////////////////////
c.add(titlePanel);
c.add(startButtonPanel);
}
/*----------------------------------------------------------------------------------------------------*/
}
EDIT: I Also managed to see why the window wasn't showing anything in my question. I just had to adjust the window size with the cursor.
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.*
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;
import com.eviware.soapui.support.types.StringToStringMap
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class Swing05 extends WindowAdapter
{
public Swing05()
{
Vector vect02 = new Vector();
vect02.addElement("ACTIVE");
vect02.addElement("VERIFY");
vect02.addElement("PENDING");
vect02.addElement("DEPLOYMENT");
vect02.addElement("PLANNING");
JComboBox cmboBox01 = new JComboBox(vect02);
cmboBox01.setAlignmentY(Component.TOP_ALIGNMENT);
// PANEL01 - VERTICAL LAYOUT BUTTONS
JTextField button02 = new JTextField("Cookie");
JTextArea button03 = new JTextArea("Locked By User");
button03.setAlignmentX(Component.CENTER_ALIGNMENT);
JPanel panel01 = new JPanel();
panel01.setLayout(new BoxLayout(panel01,BoxLayout.Y_AXIS));
panel01.add(button02);
panel01.add(Box.createVerticalStrut(5));
panel01.add(button03);
panel01.add(Box.createVerticalStrut(5));
panel01.add(cmboBox01);
//panel01.add(Box.createVerticalGlue());
//panel01.setBorder(BorderFactory.createLineBorder(Color.black));
JPanel right_panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
//right_panel.setBorder(BorderFactory.createLineBorder(Color.black));
right_panel.add(panel01);
// PANEL02 - HORIZONTAL LIST AND PANEL01
// Here, we are going to create a list of elements and place them into a BorderLayout panel
// in the centre to ensure that the list will expand in size relative to the window size.
Vector vect01 = new Vector();
vect01.addElement("COUNTRY_STG");
vect01.addElement("LOB_STG");
vect01.addElement("MRT_LABOR_BASE_RATES_STG");
vect01.addElement("MRT_LABOR_ADDERS_STG");
vect01.addElement("INFLATION_STG");
vect01.addElement("MRT_PRICE_CONFIG");
vect01.addElement("MRT_WW_CONFIG");
vect01.addElement("PAYMENT_TERMS");
vect01.addElement("PAYMENT_TERMS_MAPPING");
vect01.addElement("COUNTRY_CURR_CONFIG");
vect01.addElement("SDM_OFFERING_HIERARCHY");
vect01.addElement("SDM_FWB_MAPPING");
JList list01 = new JList(vect01);
JScrollPane scrPane = new JScrollPane(list01);
JPanel p1 = new JPanel();
p1.setLayout(new BorderLayout());
// p1.setBorder(BorderFactory.createEtchedBorder());
p1.add(scrPane,BorderLayout.CENTER);
JPanel panel02 = new JPanel();
panel02.setLayout(new BoxLayout(panel02,BoxLayout.X_AXIS));
panel02.add(Box.createHorizontalStrut(5));
panel02.add(p1);
panel02.add(Box.createHorizontalStrut(5));
//panel02.add(panel01);
panel02.add(right_panel);
panel02.add(Box.createHorizontalStrut(5));
// PANEL03 - HORIZONTAL LAYOUT FOR BUTTONS
JButton button05 = new JButton("Close");
JButton button06 = new JButton("Apply");
JPanel panel03 = new JPanel();
panel03.setLayout(new BoxLayout(panel03,BoxLayout.X_AXIS));
panel03.add(Box.createHorizontalGlue());
panel03.add(Box.createHorizontalStrut(5));
panel03.add(button05);
panel03.add(Box.createHorizontalStrut(5));
panel03.add(button06);
panel03.add(Box.createHorizontalStrut(5));
// PANEL04 - HOLDS PANEL02 and PANEL03
JPanel panel04 = new JPanel();
panel04.setLayout(new BoxLayout(panel04,BoxLayout.Y_AXIS));
panel04.add(Box.createVerticalStrut(5));
panel04.add(panel02);
panel04.add(Box.createVerticalStrut(0));
panel04.add(panel03);
panel04.add(Box.createVerticalStrut(5));
// Put EVERYTHING into a scrollable pane so if the frame isn't large enough to
// display everything, it can be reached by scrolling the pane.
JScrollPane mainPane = new JScrollPane(panel04);
// CREATE THE WINDOW AND DISPLAY THE FRAME
JFrame frame01 = new JFrame();
frame01.setContentPane(mainPane);
frame01.setTitle("Insert Variables");
frame01.setSize(500,200);
frame01.setLocation(200,200);
frame01.addWindowListener(this);
frame01.pack();
frame01.setVisible(true);
frame01.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
button05.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
frame01.dispose();
}
});
}
public static void main(String [] args)
{
Swing05 app01 = new Swing05();
}
}
Im trying to build an interface to select some variables for SoapUI .
im failing miserably .
can someone point me in the right direction ?
i wasnt able connecting the selected items to variables that can be used further.
I believe you would like to add GUI support to SoapUI through Groovy scripts. In this case I would suggest to opt for plugin development for SoapUI with GUI features.
Here is the sample which you can adapt - https://github.com/olensmar/soapui-emailtestsstep-plugin/blob/master/src/main/java/soapui/demo/teststeps/email/EMailTestStepDesktopPanel.java
I've been working on this for some time, and I'd really appreciate some help right now.
I'm trying to get the JFrame containing the text input fields to close from my actionPerformed method, but I can't seem to get anything to work. JFrame.dispose wont let me access the right Jframe, and setVisible(false) is equally useless, unless I'm doing this completely wrong.
//halp
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
class PersonInput extends JPanel
implements ActionListener {
//Fields for data entry
private JFormattedTextField firstField, lastField, dateField;
public String x[] = new String[3];
public PersonInput() {
//Values for the fields
String first = "First Name";
String last = "Last Name";
String date = "MM/DD/YYYY";
//Create the text fields and set them up.
firstField = new JFormattedTextField();
firstField.setValue(new String(first));
lastField = new JFormattedTextField();
lastField.setValue(new String(last));
dateField = new JFormattedTextField();
dateField.setValue(new String(date));
dateField.setColumns(10);
JButton ok = new JButton("OK");
ok.setVerticalTextPosition(AbstractButton.BOTTOM);
ok.setHorizontalTextPosition(AbstractButton.CENTER);
ok.setActionCommand("ok");
ok.addActionListener(this);
ok.setToolTipText("Confirms user input and continues with the program.");
JPanel buttons = new JPanel(new GridLayout(0,1));
buttons.add(ok);
//Layout the text fields in a panel.
JPanel fieldPane = new JPanel(new GridLayout(0,1));
fieldPane.add(firstField);
fieldPane.add(lastField);
fieldPane.add(dateField);
//Put the panels in this panel, labels on left,
//text fields on right.
setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
add(fieldPane, BorderLayout.CENTER);
add(buttons, BorderLayout.LINE_END);
}
public void actionPerformed(ActionEvent e) {
if ("ok".equals(e.getActionCommand()))
{
JFrame frame1 = new JFrame("People Sorter");
x[0] = firstField.getText();
x[1] = lastField.getText();
x[2] = dateField.getText();
JOptionPane.showMessageDialog(frame1, "Person has been added.");
dispPerson();
frame.setVisible(false);
}
}
public void dispPerson()
{
System.out.println(x[0] + x[1] + x[2]);
}
public static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("Person Input");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Add contents to the window.
frame.add(new PersonInput());
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
//Turn off metal's use of bold fonts
UIManager.put("swing.boldMetal", Boolean.FALSE);
createAndShowGUI();
}
});
}
}
I'm all ears if anyone has any ideas; I've been stressed over this all day. Thanks much for lending me your time!
EDIT: Just for clarification, the frame I'm trying to close is the one instantiated in the createAndShowGUI method.
it seems that the problem is that we are trying to merge both static and non static contents. For a short explanation static contents can be referred without need of creating an instance (object) of that class. Which means that createAndShowGUI can be called:
inside another static method (like main)
From class reference PersonInput.createAndShowGUI()
or from an object, but that method or attribute will be always the same, static attributes are shared.
I can suggest 2 ways to solve your problem.
One is pass the object frame to PersonInput
//halp
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
class PersonInput extends JPanel
implements ActionListener {
//Fields for data entry
private JFormattedTextField firstField, lastField, dateField;
public String x[] = new String[3];
JFrame frame;
public PersonInput(JFrame frame) {
this.frame = frame;
//the rest of your code
}
The other way is to have the frame object outside the method and declare it static.
static JFrame frame = new JFrame("Person Input");;
public static void createAndShowGUI() {
//Create and set up the window.
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Add contents to the window.
frame.add(new PersonInput());
//Display the window.
frame.pack();
frame.setVisible(true);
}
Remember that static variable cannot be referenced from a static context
I'm on Mac OSX 10.7 64 Bit.
I want a JSlider using MetalUI.
package test;
import java.awt.BorderLayout;
import javax.swing.*;
import javax.swing.plaf.metal.MetalLookAndFeel;
public class Test {
public static void main(String args[]) throws UnsupportedLookAndFeelException {
JFrame frame = new JFrame("Tick Slider");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JSlider slider = new JSlider(-100, 100, 0);
LookAndFeel save = UIManager.getLookAndFeel();
LookAndFeel laf = new MetalLookAndFeel();
UIManager.setLookAndFeel(laf);
slider.setUI(new javax.swing.plaf.metal.MetalSliderUI());
frame.add(slider, BorderLayout.NORTH);
frame.setSize(300, 200);
frame.setVisible(true);
UIManager.setLookAndFeel(save);
}
}
This example program shows me the JSlider but the triangle is translucent and I can see the rendered value bar. How can I fix that?
i'v put a jpanel on the tab of Jtabbedpane which is at the left side ,nw when the tab is clicked i want to display labels and textfields in the workspace of the tabbedpane,plz hlp.
When you say 'workspace of the tabbedpane' I think you are referring to your JPanel?
You must attach the JLabels and JTextfields to the JPanel using JPanel.add() before you add the JPanel to the JTabbedPane.
I think you should do exactly as #7SpecialGems says (+1 for that).
Here is an example showing how exactly it can look like in code.
import java.awt.Color;
import java.awt.HeadlessException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class JTabbedPaneSample
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
#Override
public void run()
{
createGUI();
}
});
}
private static void createGUI() throws HeadlessException
{
JPanel oi1 = new JPanel();
oi1.setBackground(Color.RED);
oi1.add(new JLabel("Label 1"));
JPanel oi2 = new JPanel();
oi2.setBackground(Color.PINK);
oi2.add(new JLabel("Label 2"));
oi2.add(new JTextField("TextField 1"));
JTabbedPane tp = new JTabbedPane();
tp.addTab("Oi1", oi1);
tp.addTab("Oi2", oi2);
JPanel contentPane = new JPanel();
contentPane.add(tp);
JFrame f = new JFrame();
f.setContentPane(contentPane);
f.setSize(800, 600);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
Good luck, Boro.