Scrollbar not showing up in JTextArea - java

I'm trying to put a scrolling text area, called descriptionScroll. However, the scroll bar is NOT visible. I've tried many approaches, and all end in frustration.
Am I missing anything to get the scroll bar showing? It should appear to the right of the large text box next to "Description"
Here's the relevant piece of code:
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
protected JTextArea descriptionTextArea;
protected JScrollPane descriptionScroll;
String descriptionText =
"Lot ID(s):\n" +
"Wafer ID(s):\n" +
"PSPT(Probe Ship Part Type):\n" +
"Tester:\n" +
"Tester Job Name:\n" +
"PID (FPP, FPC):\n" +
"Reprobe required before shipping lot? (Y/N)\n\n" +
"Hold for (individual):\n" +
"Hold for (group)\n" +
"Expected release date\n" +
"Hold Comments:\n\n" +
"Shipping Information:\n" +
"Special Instructions:\n";
public Constructor(){
descriptionTextArea = new JTextArea(descriptionText);
descriptionScroll = new JScrollPane(descriptionTextArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
add(descriptionTextArea);
add(descriptionScroll);
pack();
setSize(790, 625);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
descriptionTextArea.setSize(650, 200);
descriptionTextArea.setLocation(110, 228);
descriptionTextArea.setLineWrap(true);
}

You're adding both JScrollPane and JTextArea to the same container. Add the JTextArea to JScrollPane:
descriptionScroll.add(descriptionTextArea);

Related

how to display information in panel after a button is clicked?

I'm working on a application which takes pizza orders. Once the user clicks the order summary button the program would display the order summary. The application looks like this:
I would like to print out the order summary(only not the error) in a new penal with a JTextArea like such:
But I don't know how. This is what my application displays right now:
Here is the Code related to the display:
orderSummary = "Customer Name: " + name +
"\nPhone Number: " + phoneNumber +
"\nSize: " + size +
"\nToppings: " + toppings +
"\nTotal: $" + total;
if(error)
JOptionPane.showMessageDialog(null, ErrorString);
else
JOptionPane.showMessageDialog(null, orderSummary);
Error display:
I'm not 100% sure of what you are asking, but if you are looking for a dialog to popup (not just a panel), then you could try something like:
JDialog zMessageDialog = new JDialog((java.awt.Frame) null, true);
zMessageDialog.setTitle("Order summary");
zMessageDialog.setLayout(new BorderLayout());
JTextArea zTextArea = new JTextArea("Blah blah\nblah blah\nblah blah");
zTextArea.setEditable(false);
zTextArea.setColumns(40);
zTextArea.setRows(10);
zTextArea.setBackground(null);
JScrollPane zScrollPane = new JScrollPane(zTextArea);
zMessageDialog.add(zScrollPane, BorderLayout.CENTER);
zMessageDialog.revalidate();
zMessageDialog.pack();
zMessageDialog.setVisible(true);
This just puts a JTextArea in a JDialog. It makes the JTextArea non-editable, and sets its background color to null (which makes it look less editable).
Of course, this may not be the best way to go in terms of a user interface, but that is a different question. If you are using an IDE like Netbeans, you can easily create a separate class based on JDialog and add a panel at the bottom with an "OK" button, and whatever other customizations you desire.

Text field changes size to fullscreen when i resize my window

I have a text field set to size 100x400 (it's under icons and f(x) = ... text)
and if i resize my window even by 1px when the applet is already running then it's changing to this:
code for textfield:
TextField textFieldA = new TextField("7.5", 35);
...
add(aa);
add(textFieldA);
aa.setLocation(920, 600);
textFieldA.setBounds((int)(920 + aa.getWidth() + 10),595,150,30);
aa is the image with "a = "

Displaying multiple line text in JLabel

I have a problem to display multiple line in Jlabel. I tried to use html tag and that didn't helped me. I just wonder why the following code is not working. I used <br> tag and till it displays in one line.
Any help please...
My Java code is the following
package p1;
import javax.swing.*;
import java.awt.*;
public class MemoryUtil
{
private static final int MegaBytes = 10241024;
public static void main(String args[])
{
long freeMemory = Runtime.getRuntime().freeMemory()/MegaBytes;
long totalMemory = Runtime.getRuntime().totalMemory()/MegaBytes;
long maxMemory = Runtime.getRuntime().maxMemory()/MegaBytes;
String data="";
data= data + " <html> JVM Free Memory: " + Long.toString(freeMemory)+" MB <br>";
data=data + "Initial Heap Size of JVM : "+ Long.toString(totalMemory) +" MB <br>";
data= data + " Maximum Heap Size <br>of JVM: " + Long.toBinaryString(maxMemory) +" MB </html>";
createAndShowGUI(data);
}
private static void createAndShowGUI(String input)
{
JFrame frame = new JFrame("JVM Setting of your Machine ");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout( new GridLayout());
frame.setSize(new Dimension(450, 400));
frame.setLocation(new Point(400, 200));
frame.setResizable(true);
JLabel label = new JLabel(input);
label.setFont(new Font("Serif", Font.BOLD, 20));
label.setHorizontalAlignment(JLabel.CENTER);
frame.add(label);
frame.setVisible(true);
}
}
data + " <html> JVM Free Memory: "
Should be more along the lines of:
"<html><body>JVM Free Memory: "
It requires the <html> element to be the 1st part of the String.
Best practice would be to make it valid HTML by adding the <body> prefix.
You have a white space in front of <HTML>. remove it and it works :data= data + "<html> JVM

How can I create a new line within a JTabbedPane JComponent Panel?

I'm creating a short program that involves a guest and a tabbed pane. I want to program the JTabbedPane so when I click on a certain tab, the guest's information will be displayed using the JComponent makeTextPanel function. However, it seems to ignore the '\n' (new line) when it runs. Is there any way to fix this?
This is my GUI:
JTabbedPane overview= new JTabbedPane();
JComponent accountinfo= makeTextPanel (guest.toString());
overview.addTab ("Account Overview", accountinfo);
overview.setMnemonicAt(0, KeyEvent.VK_1);
JFrame tabbed= new JFrame("AIR Reservation");
tabbed.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tabbed.add(overview);
tabbed.setSize(500,300);
tabbed.setLocationRelativeTo(null);
tabbed.setVisible(true);
This is the toString method for my Customer class:
public String toString()
{
customerstring= "Name: " + getName();
customerstring+= "\nGender: " + getGender();
customerstring+= "\nDate of Birth: " + getBirthDate();
customerstring+= "\nPassport number: " + getPassportNumber();
customerstring+= "\nBalance: " + getMoney();
return customerstring;
}
Thanks for the help!
Edit: here's the makeTextPanel method:
protected JComponent makeTextPanel(String text)
{
JPanel panel = new JPanel(false);
JLabel filler = new JLabel(text);
filler.setHorizontalAlignment(JLabel.CENTER);
panel.setLayout(new GridLayout(1, 1));
panel.add(filler);
return panel;
}
Your panel contains a JLabel that has as a text the one you pass in the makeTextPanel as an argument. A JLabel can have multiple lines if the text is in html format.
So your text should be encapsulated inside <html></html> and the line separator should be <br>.
Other option would be to use a JTextArea or a JEditorPane instead of JLabel. You can set them non-editable, if needed.

BorderLayout delay issues

After a very long couple of days I have determined that there is a delay when displaying text very quickly in a text area if that text area is in a border layout. My question is, why does the following code take 10-20 times longer to execute using border layout than without (comment out one of the two methods either addWithBorderLayout or addWithoutBorderLayout) AND is there a way to use the border layout without this delay? (The problem exists with or without the SwingUtilities invokeLater() method.)
import java.awt.BorderLayout;
import java.awt.Label;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JDesktopPane;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;
public class Driver
{
public static void main(String args[])
{
System.out.println("JEditPane Test");
//window to display the plyed back text
JFrame mainFrame = new JFrame("Main Frame");
//holds some text to be played back
final JEditorPane editPane1 = new JEditorPane();
final JEditorPane editPane2 = new JEditorPane();
//desktop pane to hold docs
JDesktopPane desktopPane = new JDesktopPane();
//create an internal frame
JInternalFrame internalFrame1 = new JInternalFrame("Test Doc 1", true, true, true, true);
internalFrame1.setContentPane(new JScrollPane(editPane1));
internalFrame1.setSize(400, 400);
internalFrame1.setVisible(true);
internalFrame1.setLocation(0, 0);
JInternalFrame internalFrame2 = new JInternalFrame("Test Doc 2", true, true, true, true);
internalFrame2.setContentPane(new JScrollPane(editPane2));
internalFrame2.setSize(400, 400);
internalFrame2.setVisible(true);
internalFrame2.setLocation(400, 0);
//add it to the desktop
desktopPane.add(internalFrame1);
desktopPane.add(internalFrame2);
//map of editor panes
final Map < String, JEditorPane > mapOfPanes = new HashMap < String, JEditorPane >();
mapOfPanes.put("1", editPane1);
mapOfPanes.put("2", editPane2);
//COMMENT ONE OF THESE TWO OUT!!!
addWithBorderLayout(mainFrame, desktopPane);
//addWithoutBorderLayout(mainFrame, desktopPane);
//for closing
mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//set the size and location of the window
mainFrame.setSize(800,500);
mainFrame.setLocation(100, 100);
//make the window visible
mainFrame.setVisible(true);
//create some text to display
StringBuilder builder = new StringBuilder();
builder.append("This is a rather long string of text. ");
//build up a good amount of text
for(int i = 0;i < 5;i++)
{
//copy it a few times
builder.append(builder.toString());
}
//get the string
final String longStringOfText = builder.toString();
//create a thread to call setText on the editor pane
Thread thread = new Thread(new Runnable()
{
#Override
public void run()
{
//for gathering stats
int sum = 0;
int numberOfCharsToPrintFromString = 0;
Date prev = new Date();
Date current = new Date();
System.out.println("Num Panes: " + mapOfPanes.size());
//for each pane
for(JEditorPane pane : mapOfPanes.values())
{
//to help in printing subsections of the big string
numberOfCharsToPrintFromString = 0;
while(numberOfCharsToPrintFromString < longStringOfText.length())
{
//wait a short amount of time
try{Thread.sleep(1);}catch(Exception e){}
//grab sections of the long string
String text = longStringOfText.substring(0, numberOfCharsToPrintFromString);
//set the text of the pane
pane.setText(text);
//stats
numberOfCharsToPrintFromString++;
long diff = current.getTime() - prev.getTime();
sum = sum + (int)diff;
prev = current;
current = new Date();
}
}
System.out.println("Average time in between events: " + ((double)sum/(double)numberOfCharsToPrintFromString));
}
});
thread.start();
}
private static void addWithoutBorderLayout(JFrame mainFrame, JDesktopPane desktopPane)
{
mainFrame.add(desktopPane);
}
private static void addWithBorderLayout(JFrame mainFrame, JDesktopPane desktopPane)
{
mainFrame.setLayout(new BorderLayout());
mainFrame.add(new Label("Top Panel"), BorderLayout.NORTH);
mainFrame.add(desktopPane, BorderLayout.CENTER);
mainFrame.add(new Label("Bottom Panel"), BorderLayout.SOUTH);
}
}
On Mac OS X 10.5.8 using Java version 1.6, I see a comparable disparity unless I set apple.awt.graphics.UseQuartz at the beginning of main(). Here is a related example that affects font rendering quality rather than execution time.
if (System.getProperty("os.name").startsWith("Mac OS X")) {
System.setProperty("apple.awt.graphics.UseQuartz", "true");
}
I use JDK6_17 on XP with an older computer and don't notice the difference you experience. My timings where betweenn 20-22 in both cases.
I then changed the sleep time to 10ms and the timings are remarkably similiar.
For the default layout:
Average time in between events: 31.236842105263158
Average time in between events: 31.236842105263158
Average time in between events: 31.236842105263158
For the Border layout:
Average time in between events: 31.236842105263158
Average time in between events: 31.23766447368421
Average time in between events: 31.236842105263158
In fact I can't believe they are identical in 5 of 6 cases.
By default the content pane of a JFrame does use a BorderLayout. So when you add components to the frame all you need to do is:
frame.add(topComponent, BorderLayout.NORTH);
frame.add(centerComponent);
frame.add(bottomComponent, BorderLayout.SOUTH);
and the frame will add the components to the content pane at the proper location.
Why are you changing the layout of the frame, instead of the content pane. Normally you would only ever change the layout of the content pane. The root pane of the frame is use to hold the menu bar and the content pane. So maybe you change the default layout manager of the entire frame you are causing some problems?

Categories

Resources