Оглавление

This is true java. Некоторые советы по использованию Java.

Содержание

Как сравнивать строки

Как узнать путь к папке, из которой запущена программа на Java

JComboBox on JDesktopPane on GlassPane

Как сравнивать строки в Java

У всех начинающих как правило возникает эта проблема. Самый очевидный способ: str1==str2. Но он не сработает. Дело в том, что тип String в Java - это класс. А классы нужно сравнивать так:

String str1="str1";
String str2="str1";
if (str1.equals(str2))
{
  System.out.println("Strings are equal!");
}

Как узнать путь к папке, из которой запущена программа на Java

Я долго бился над этим вопросом. Дело в том, что текущая рабочая директория может отличаться от действительного пути, где находится jar-архив. Например в Linux после запуска jar-архива текущая рабочая папка устанавливается в домашнюю папку пользователя. Поэтому new File(".").getAbsolutePath() не сработает. Правильно определять путь к папке, в которой расположен jar-архив надо так:

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;

/**
 * http://www.dxgames.narod.ru.
* Класс для определения пути, из которого была стартована программа. * @author Урванов Ф. В. * */ public class ApplicationStartUpPath { public String getApplicationStartUp() throws UnsupportedEncodingException { String strPath=getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); try { URL url=new URL(strPath); strPath=url.getPath(); } catch(MalformedURLException malformedUrlException) { } File f=new File(strPath); String strResult=URLDecoder.decode(f.getParent(),"UTF-8"); return strResult; } }

Класс ApplicationStartUpPath нужно положить в тот же каталог (пакет), что и основной класс вашей программы. После этого вы сможете определять путь к папке, из которой запущена программа на Java так:

ApplicationStartUpPath dir=new ApplicationStartUpPath();			   
String strApplicationStartUp=dir.getApplicationStartUp();

Java JComboBox on JInternalFrame on JDesktopPane on GlassPane

Java PopupMenu on JInternalFrame on JDesktopPane on GlassPane

Классы JInternalFrame и JDesktopPane используются для создания MDI интерфейсов. GlassPane используется для создания различных эффектов: затенения интерфейса при длительных операциях и т. д. Но есть один небольшой баг. Если на форме расположить JDesktopPane. GlassPane у формы поставить другой JDesktopPane, то на втором JDesktopPane, который расположен на GlassPane, не будут работать ComboBox-ы и PopupMenu. В доказательство привожу ссылку на официальный баг: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4458526.

На самом деле вы поймёте, почему это происходит, если прочитаете про JRootPane. Смысл в том, что слой, на котором рисуется PopupMenu оказывается под слоем с JInternalFrame и JInternalFrame перекрывает его. Первоначально каждая форма имеет один JRootPane. Вам не нужно самому создавать экземпляр класса JRootPane. Но чтобы обойти этот баг можно продублировать JRootPane (то есть вам нужно положить ещё один JRootPane на форму), как показано в этом примере:

package GlassPaneTest;

import java.awt.event.ActionEvent;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.JRootPane;

import dxgames.internalglassframe.InternalGlassFrame;



/**
 * Обход ошибки http://bugs.sun.com/view_bug.do?bug_id=6778882.
 * @author Урванов Фёдор Владиславович.
 *
 */
public class GlassPaneTest extends JApplet{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public void init()
	{
		JRootPane rp=new JRootPane();
		JDesktopPane mainDesktopPane=new JDesktopPane();
		
		
		
		JInternalFrame mainInternalFrame=new JInternalFrame();
		mainInternalFrame.setSize(200,200);
		mainInternalFrame.setLocation(10,10);
		mainInternalFrame.setVisible(true);
		mainInternalFrame.setTitle("GGG");
		mainInternalFrame.setLayout(null);
		JButton btn=new JButton("GO");
		mainInternalFrame.add(btn);
		btn.setSize(100, 100);
		btn.setLocation(10,10);
		
		mainDesktopPane.add(mainInternalFrame);
		mainDesktopPane.setVisible(true);
		mainDesktopPane.setLayout(null);
		
		
		rp.getContentPane().add(mainDesktopPane);
		rp.setVisible(true);
		
		final JInternalFrame internalFrameOnGlassPane=new JInternalFrame();
		internalFrameOnGlassPane.setSize(200,200);
		internalFrameOnGlassPane.setLocation(10,10);
		internalFrameOnGlassPane.setVisible(true);
		internalFrameOnGlassPane.setTitle("XXX");
		internalFrameOnGlassPane.setLayout(null);
		internalFrameOnGlassPane.setClosable(true);
		JComboBox cmb=new JComboBox();
		cmb.addItem("F1");
		cmb.addItem("F2");
		cmb.addItem("F3");
		cmb.setLightWeightPopupEnabled(false);
		cmb.setSize(100,30);
		internalFrameOnGlassPane.add(cmb);
		
		
		setSize(600,600);
		
		internalGlassFrame=new InternalGlassFrame(rp,mainDesktopPane);
		add(rp);
		btn.addActionListener(
				new java.awt.event.ActionListener()
				{
					public void actionPerformed(ActionEvent evt)
					{
						internalGlassFrame.showInternalFrame(internalFrameOnGlassPane);
					}
				});
		
		doLayout();
		setVisible(true);
	}
	
	InternalGlassFrame internalGlassFrame;
}



В результате мы получим вполне работающий ComboBox.

Скачать jar архив со скомпилированными классами и с исходниками.

Скачать ZIP архив с исходниками.

This example uses an applet.