im trying now for some hours to set the width of my TextPane.
My Code is like this :
private JTextPane eingabe = new JTextPane ();
private JTextPane ausgabe = new JTextPane ();
private JScrollPane scrollbar_eingabe = new JScrollPane(eingabe);
private JScrollPane scrollbar_ausgabe = new JScrollPane(ausgabe);
......
.......
private void createLayout(JComponent... arg) {
Container pane = this.getContentPane();
GroupLayout layout = new GroupLayout(pane);
pane.setLayout(layout);
layout.setAutoCreateContainerGaps(true);
layout.setAutoCreateGaps(true);
layout.setHorizontalGroup(
layout.createSequentialGroup() // ------
.addComponent(arg[0])
.addGroup(layout.createParallelGroup()
.addComponent(arg[1])
.addComponent(arg[2]))
.addGroup(layout.createParallelGroup()
.addComponent(arg[3])
.addComponent(arg[4]))
)
;
layout.setVerticalGroup(layout.createParallelGroup() // |||||
.addComponent(arg[0])
.addGroup(layout.createSequentialGroup()
.addComponent(arg[1])
.addComponent(arg[2]))
.addGroup(layout.createSequentialGroup()
.addComponent(arg[3])
.addComponent(arg[4]))
);
//gl.linkSize(pwd_text, user_text ,user, pwd, start);
pack();
}
protected void initWindow()
{
.....
createLayout(start, eingabe_text, scrollbar_eingabe,script_text, scrollbar_ausgabe);
}
The first arg is a button, the second one a label, then the first Textpane/ScrollPane, then another label and another ScrollPane.
The arrangement of the components is working so far, but i realy dont get it how to set the width of one of those text/scrollpanes.
The first one should have max a 1/3 of the width of the second Pane.
Everything in my program is working fine, but im just to dumb to set the width of this Scrollpane :(
Edit:
It should lock like this:
A1 A2 A4
A3 A5
And A3 should have the width A5/3.
Edit:
Okay, i solved the problem with this:
Dimension d = new Dimension();
d.height = 610;
d.width = 250;
arg[2].setPreferredSize(d);
Dimension d1 = new Dimension();
d1.height = 610;
d1.width = d.width * 4;
arg[4].setPreferredSize(d1);
layout.setHorizontalGroup(
layout.createSequentialGroup() // ------
.addComponent(arg[0])
.addGroup(layout.createParallelGroup()
.addComponent(arg[1])
.addComponent(arg[2], GroupLayout.PREFERRED_SIZE,
GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createParallelGroup()
.addComponent(arg[3])
.addComponent(arg[4], GroupLayout.PREFERRED_SIZE,
GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE))
)
;
layout.setVerticalGroup(layout.createParallelGroup() // |||||
.addComponent(arg[0])
.addGroup(layout.createSequentialGroup()
.addComponent(arg[1])
.addComponent(arg[2], GroupLayout.PREFERRED_SIZE,
GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(arg[3])
.addComponent(arg[4], GroupLayout.PREFERRED_SIZE,
GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE))
);
Working with grouplayout and other layouts is realy confusing in java ;D
If GroupLayout is not required to use, I would suggest other layout instead like GridLayout or GridBagLayout
or
JtextPane must be under different layout
Related
I am having an issue with a ScrolledForm. I am trying to change the background and foreground colour for a Label defined in the body of the ScrolledForm, however it doesn't seem to be working.
In my code snippet, I would like lblWhat to have a black background and white foreground.
Here is my code snippet:
ScrolledForm scrldfrmNewScrolledform = formToolkit.createScrolledForm(parent);
scrldfrmNewScrolledform.setLayoutData(gd);
scrldfrmNewScrolledform.setFont(SWTResourceManager.getFont("Segoe UI", 16, SWT.NORMAL));
scrldfrmNewScrolledform.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_BACKGROUND));
scrldfrmNewScrolledform.getBody().setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
scrldfrmNewScrolledform.setImage(SWTResourceManager.getImage(EPRForm.class, "/icons/AFCCEPR.png"));
scrldfrmNewScrolledform.setBounds(10, 10, 430, 280);
formToolkit.paintBordersFor(scrldfrmNewScrolledform);
scrldfrmNewScrolledform.setText("ePR (electronic Purchase Request)");
Label lblName = new Label(scrldfrmNewScrolledform.getBody(), SWT.NONE);
lblName.setBounds(10, 21, 55, 15);
formToolkit.adapt(lblName, true, true);
lblName.setText("Name:");
text = new Text(scrldfrmNewScrolledform.getBody(), SWT.BORDER);
text.setBounds(71, 15, 269, 21);
formToolkit.adapt(text, true, true);
Label lblWhat = new Label(scrldfrmNewScrolledform.getBody(), SWT.None);
lblWhat.setBounds(10, 35, 100, 15);
lblWhat.setBackground(SWTResourceManager.getColor(SWT.COLOR_BLACK));
lblWhat.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
formToolkit.adapt(lblWhat, true, true);
lblWhat.setText("What do you want?");
Label lblItem = new Label(scrldfrmNewScrolledform.getBody(), SWT.None);
lblItem.setBounds(10, 55, 100, 15);
formToolkit.adapt(lblItem, true, true);
lblItem.setText("Items to be Ordered*");
txtItems = new Text(scrldfrmNewScrolledform.getBody(), SWT.BORDER | SWT.WRAP | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CANCEL);
txtItems.setBounds(10, 60, 338, 84);
formToolkit.adapt(txtItems, true, true);
You seem to be using FormToolkit. The FormToolkit.adapt method forces the control colors to the colors set for the form (normally white background and black text).
For a single control you could try calling setBackground and setForeground after the adapt call.
You can set the colors for the entire form with
FormColors colors = toolkit.getColors();
colors.setBackground(...);
colors.setForeground(...);
The horizontal layout:
layout.setHorizontalGroup(
layout.createSequentialGroup()
.addComponent(find)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false)
.addComponent(input, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(amountWords, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(displayWords, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(clearButton)
);
The vertical layout:
layout.setVerticalGroup(
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false)
.addComponent(find)
.addComponent(input)
.addComponent(clearButton))
.addComponent(amountWords)
.addComponent(displayWords)
);
I'm trying the make the input (JTextField), amountWords (JLabel) and the displayWords (JTextArea) resizable depending on the width and height of the screen. The height/length of the display words is already resizing depending of the height of the screen.
But how can I make the JTextField and the JTextArea resizable?
Thanks!
These images show a chat box that needs to be resized with the application frame. I'm using GroupLayout to do so. The hierarchy of the frame goes something like this
chatDiv(JPanel, GroupLayout)->chatTabbedPane(JTabbedPane, GroupLayout)
->chatPanel(extended JPanel, GroupLayout)
But, these individual chat_tabs(chatPanel) are added to the chatTabbedPane dynamically during application runtime.
Problem is: These chatPanel(s) are expanding with the expansion of application
frame but they are not shrinking with the shrink in width of application frame.
initialized frame
and when I expand and again shrink the application frame this happens (size of chatPanel doesn't shrink leading to invisible overflown region)..
expanded and again shrinked frame
Here is the class chatPanel that extends JPanel:
class chatPanel extends JPanel{
private static final long serialVersionUID = 1L;
GroupLayout gl_panel;
JTextArea textArea;
JTextField textField;
JButton sendTextButton;
JButton closeChatButton;
int replyRef;
public chatPanel(int ref){
//this.setLayout(null);
closeChatButton = new JButton("");
sendTextButton = new JButton("SEND");
textField = new JTextField();
textArea = new JTextArea();
replyRef = ref;
textArea.setWrapStyleWord(true);
textArea.setEditable(false);
textArea.setLineWrap(true);
//textArea.setBounds(0, 0, 370, 99);
this.add(textArea);
//textField.setBounds(0, 101, 290, 20);
//textField.setColumns(10);
this.add(textField);
sendTextButton.setFont(new Font("Tahoma", Font.PLAIN, 10));
//sendTextButton.setBounds(290, 101, 60, 19);
this.add(sendTextButton);
closeChatButton.setIcon(new ImageIcon("files/close.png"));
closeChatButton.setSelectedIcon(null);
closeChatButton.setToolTipText("CLOSE");
closeChatButton.setFont(new Font("Tahoma", Font.PLAIN, 5));
//closeChatButton.setBounds(350, 101, 20, 19);
this.add(closeChatButton);
gl_panel = new GroupLayout(this);
gl_panel.setHorizontalGroup(
gl_panel.createParallelGroup(Alignment.TRAILING)
.addGroup(gl_panel.createSequentialGroup()
.addGap(1)
.addComponent(textField, GroupLayout.DEFAULT_SIZE, 286, Short.MAX_VALUE)
.addGap(1)
.addComponent(sendTextButton, GroupLayout.PREFERRED_SIZE, 60, GroupLayout.PREFERRED_SIZE)
.addGap(1)
.addComponent(closeChatButton, GroupLayout.PREFERRED_SIZE, 20, GroupLayout.PREFERRED_SIZE)
.addGap(1))
.addComponent(textArea, GroupLayout.DEFAULT_SIZE, 370, Short.MAX_VALUE)
);
gl_panel.setVerticalGroup(
gl_panel.createParallelGroup(Alignment.LEADING)
.addGroup(gl_panel.createSequentialGroup()
.addComponent(textArea, GroupLayout.PREFERRED_SIZE, 100, GroupLayout.PREFERRED_SIZE)
.addGroup(gl_panel.createParallelGroup(Alignment.LEADING)
.addGroup(gl_panel.createSequentialGroup()
.addGap(1)
.addGroup(gl_panel.createParallelGroup(Alignment.TRAILING, false)
.addGroup(gl_panel.createSequentialGroup()
.addComponent(sendTextButton, GroupLayout.PREFERRED_SIZE, 19, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED))
.addGroup(gl_panel.createSequentialGroup()
.addComponent(closeChatButton, GroupLayout.PREFERRED_SIZE, 19, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)))
.addGap(0, 0, Short.MAX_VALUE))
.addGroup(gl_panel.createSequentialGroup()
.addGap(1)
.addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addGap(1))))
);
this.setLayout(gl_panel);
}
}
and this is how I add these chatPanel(s) to chatTabbedPane
chatPanel newChat = new chatPanel(chatRef);
chatTabbedPane.addTab("title", null, newChat, null);
I want to shrink the size of chatPanel with shrink in size of application frame.
I've just run into this issue as well, and an answer like "just use another layout manager" isn't an answer I'm willing to accept.
To answer your question, the line wrap is messing things up.
textArea.setLineWrap(true);
Comment that line out and test again to see it will resize down with the window/frame like expected.
However, the side effect is obviously no line wraps. What's not so obvious is when your text length becomes greater than the textarea's width, when you resize the window the textarea's width will lock to the text's length. I still haven't found a fix for this new problem yet.
I'm attempting to create a small Jpanel with a GroupLayout infront of it. Having followed the documentation as much as possible as well as looked at a number of StackOverflow questions, I'm still stuck.
The error is as follows:
Exception in thread "AWT-EventQueue-0"
java.lang.IllegalStateException:
javax.swing.JButton[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.5,border=com.apple.laf.AquaButtonBorder$Dynamic#5eef2e7c,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=2,bottom=0,right=2],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Invest,defaultCapable=true] is not attached to a vertical group
I know that the problem is related to where the buttons are being attached. After all the error says it explicitly. However, I just can't figure out in what manner I'm supposed to attach them. Any ideas?
JPanel panel = new JPanel();
GroupLayout layout = new GroupLayout(panel);
panel.setLayout(layout);
panel.setMinimumSize(new Dimension(2000,100));
panel.setBorder(BorderFactory.createTitledBorder((cdo.getTicker()) + " : (" + cdo.getCurrency() + ")"));
layout.setVerticalGroup(
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(new JButton("Invest")))
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(new JButton("Ignore")))
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(new JButton("Article")))
);
layout.setHorizontalGroup(
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(new JButton("Invest"))
.addComponent(new JButton("Ignore"))
.addComponent(new JButton("Article"))
)
);
new JButton("Invest") creates a new button, which is different from the button previously created using new JButton("Invest").
Move the initializations of the buttons before the layout:
JButton investButton = new JButton("Invest");
JButton articleButton = new JButton("Article");
JButton ignoreButton = new JButton("Ignore");
layout.setVerticalGroup(
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(investButton))
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(ignoreButton))
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(articleButton)));
layout.setHorizontalGroup(
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(investButton)
.addComponent(ignoreButton)
.addComponent(articleButton)));
i'm new in java and recently started to develop an simple application. For the moment i have a problem with JScrollPanne, it's not able to scroll down (or up) when the text in textarea more than size of area. I have looked to some solutions, but all of them were for FlowLayot (GridLayout and BoxLayout), but not for GroupLayout. Here is the code:
JPanel conent_p = new JPanel();
conent_p.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));
JLabel lblItemName = new JLabel("Item name:");
itemField = new JTextField();
itemField.setColumns(10);
JLabel lblMxPrice = new JLabel("Max price:");
mpriceField = new JTextField();
mpriceField.setColumns(10);
JLabel lblQuantity = new JLabel("Quantity:");
quanField = new JTextField();
quanField.setColumns(10);
JLabel lblDelivery = new JLabel("Delivery:");
delivField = new JTextField();
delivField.setColumns(10);
JLabel lblLogcat = new JLabel("LogCat:");
final JTextArea txtConsole = new JTextArea();
txtConsole.setEditable(false);
txtConsole.setLineWrap(true);
txtConsole.setWrapStyleWord(true);
sbrText = new JScrollPane(txtConsole);
sbrText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
// Now create a new TextAreaOutputStream to write to our JTextArea control and wrap a
// PrintStream around it to support the println/printf methods.
PrintStream out = new PrintStream(new TextAreaOutputStream(txtConsole));
// redirect standard output stream to the TextAreaOutputStream
System.setOut(out);
// redirect standard error stream to the TextAreaOutputStream
System.setErr(out);
GroupLayout gl_conent_p = new GroupLayout(conent_p);
gl_conent_p.setHorizontalGroup(
gl_conent_p.createParallelGroup(Alignment.LEADING)
.addGroup(gl_conent_p.createSequentialGroup()
.addContainerGap()
.addGroup(gl_conent_p.createParallelGroup(Alignment.LEADING)
.addComponent(lblMxPrice, Alignment.TRAILING)
.addComponent(lblItemName, Alignment.TRAILING)
.addComponent(lblLogcat, Alignment.TRAILING))
.addGap(18)
.addGroup(gl_conent_p.createParallelGroup(Alignment.LEADING)
.addGroup(gl_conent_p.createSequentialGroup()
.addGroup(gl_conent_p.createParallelGroup(Alignment.LEADING, false)
.addComponent(itemField, GroupLayout.PREFERRED_SIZE, 365, GroupLayout.PREFERRED_SIZE)
.addGroup(gl_conent_p.createSequentialGroup()
.addComponent(mpriceField, GroupLayout.PREFERRED_SIZE, 80, GroupLayout.PREFERRED_SIZE)
.addGap(18)
.addComponent(lblQuantity)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(quanField, 0, 0, Short.MAX_VALUE)
.addGap(18)
.addComponent(lblDelivery)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(delivField, GroupLayout.PREFERRED_SIZE, 80, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)))
.addGap(100))
.addGroup(gl_conent_p.createSequentialGroup()
.addComponent(txtConsole, GroupLayout.PREFERRED_SIZE, 345, GroupLayout.PREFERRED_SIZE)
.addComponent(sbrText)
.addContainerGap())))
);
gl_conent_p.setVerticalGroup(
gl_conent_p.createParallelGroup(Alignment.LEADING)
.addGroup(gl_conent_p.createSequentialGroup()
.addContainerGap()
.addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
.addComponent(lblItemName)
.addComponent(itemField, GroupLayout.PREFERRED_SIZE, 20, GroupLayout.PREFERRED_SIZE))
.addGap(20)
.addGroup(gl_conent_p.createParallelGroup(Alignment.LEADING)
.addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
.addComponent(lblDelivery)
.addComponent(delivField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
.addComponent(lblMxPrice)
.addComponent(mpriceField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(lblQuantity)
.addComponent(quanField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
.addGap(55)
.addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
.addComponent(lblLogcat)
.addComponent(txtConsole, GroupLayout.PREFERRED_SIZE, 200, GroupLayout.PREFERRED_SIZE)
.addComponent(sbrText))
.addContainerGap())
);
conent_p.setLayout(gl_conent_p);
getContentPane().add(conent_p, BorderLayout.NORTH);
JButton btnBuy = new JButton("Buy");
btnBuy.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent ev) {
try {
String title = itemField.getText().trim();
String mprice = mpriceField.getText().trim();
String quantity = quanField.getText().trim();
String deliver = delivField.getText().trim();
Item_CONCEPT item = new Item_CONCEPT();
item.setName(title);
item.setDelivery(Integer.parseInt(deliver));
item.setStartPrice(0);
item.setMaxPrice(Integer.parseInt(mprice));
myAgent.existsSeller(item);
Date date = new Date();
DateFormat df = new SimpleDateFormat("dd.MM.yy HH:mm");
System.out.println(df.format(date)+": Buyer orders an item: "+item.getName());
//Clearing all fields
itemField.setText("");
quanField.setText("");
delivField.setText("");
//txtConsole.setText("");
mpriceField.setText("");
}
catch (Exception e) {
JOptionPane.showMessageDialog(BuyerGUI.this, "A field is filled incorrectly. "+e.getMessage()+" is invalid.", "Error", JOptionPane.ERROR_MESSAGE);
}
}
} );![enter image description here][1]
The issue you observe comes from two facts:
You are adding your content panel to BorderLayout.NORTH
You add the text console as well as the scroll pane as separate components
For the first one: replace
getContentPane().add(conent_p, BorderLayout.NORTH);
with
getContentPane().add(conent_p, BorderLayout.CENTER);
and for the second: do not add the txtConsole separately, i.e.
inside the horizontal group substitute
.addGroup(gl_conent_p.createSequentialGroup()
.addComponent(txtConsole, GroupLayout.PREFERRED_SIZE, 345, GroupLayout.PREFERRED_SIZE)
.addComponent(sbrText).addContainerGap());
with
.addComponent(sbrText);
and inside the vertical group
.addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
.addComponent(lblLogcat)
.addComponent(txtConsole, GroupLayout.PREFERRED_SIZE, 200, GroupLayout.PREFERRED_SIZE)
.addComponent(sbrText)).addContainerGap()));
with
.addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
.addComponent(lblLogcat)
.addComponent(sbrText)).addContainerGap()));
Not sure whether this is the problem (as you did not provide an SSCCE, just a piece of code), but you are both adding the txtConsole and the sbrText:
.addComponent(txtConsole, GroupLayout.PREFERRED_SIZE, 200, GroupLayout.PREFERRED_SIZE)
.addComponent(sbrText)
When you put the text area in a scrollpane, it is sufficient to add the scrollpane.
Further, I would recommend to set the preferred size of the scroll pane, as shown in the scroll pane tutorial