[Java] Advanced Swing-JList

インターフェイスデザインはJavaで広く使用されているため、JavaのSwingコンポーネントのパフォーマンスは非常に柔軟です。

Jlistはどのように設計されていますか?実際、Jlistはグラフィックとデータを分離します。Tは、JList内の文字列の配列にすることができます。

String[] text={
    
    A,B,C,D};
JList<String> list=new JList<String>(text);

リスト要素を自由に追加したい場合は、ListModelインターフェイスを実装するDefaultListModelを取得できます。

DefaultListModel<String> model=new DefaultListModel<>();

addElement()を使用して要素を追加し、JListにリストを再描画するように通知します。

JListの外観を変更するには、セルレンダラーを設定する必要があります。セルレンダラーは、JComponentを継承し、ListCellRendererインターフェイスを実装する必要があります。

セルが描画されるたびに、public Component
getListCellRendererComponent(JList <?extends Object> list、Object value、
int index、boolean isSelected、boolean cellHasFocus)メソッドが呼び出され、
Componentオブジェクトが返され、セルはを使用して描画されます。 paintComponent()メソッドグリッドを描画した後、
getPreferredSize()を呼び出して、コンポーネントのサイズを返します。

JLabelオブジェクトを作成し、それをpublic Component
getListCellRendererComponent(JList <?extends Object> list、Object value、
int index、boolean isSelected、boolean cellHasFocus)メソッドに返す簡単な方法があるため、描画する必要はありません。ブラシ付き(グラフィックスオブジェクト)上。これは、リストにタグを追加するのと同じです。

JListにはスクロールバーがないため、自分でカスタマイズする必要もあります。

これは非常に複雑であることを認めなければなりませんが、このデザインにより、リストのスタイルを自由に設定できます。セルごとにスタイルをカスタマイズすることもできます。これには、他の言語で実装するためにより多くのコードが必要になる場合があります。

例を以下に示します

package JList;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;

import javax.swing.DefaultListModel;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;

public class JListTest {
    
    

	public static void main(String[] args) 
	{
    
    
		AreaListFrame frame=new AreaListFrame("Area");
		EventQueue.invokeLater(()->{
    
    
			frame.setVisible(true);
		});
	}
	
}
class AreaListFrame extends JFrame
{
    
    
	private JList<String> areaList;
	public AreaListFrame(String title)
	{
    
    
		super(title);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLayout(new BorderLayout());
		JPanel cpanel=new JPanel();
		DefaultListModel<String> model=new DefaultListModel<>();
		model.addElement("安徽");		
		model.addElement("湖南");
		model.addElement("山东");
		model.addElement("东北");
		model.addElement("辽宁");
		model.addElement("湖北");
		model.addElement("河北");
		model.addElement("河南");
		model.addElement("江苏");
		model.addElement("浙江");
		model.addElement("新疆");
		areaList=new JList<>(model);
		areaList.setCellRenderer(new MyRenderer());
		//后来加入元素,列表自动重新绘制
		model.addElement("黑龙江");
		cpanel.add(new JScrollPane(areaList),BorderLayout.CENTER);
		add(cpanel);
		pack();
	}
	class MyRenderer extends JComponent implements ListCellRenderer<String>
	{
    
    
		private Font font=new Font(Font.SANS_SERIF,Font.PLAIN,18);
		private String text;
		private int index;
		private Color evenColor=Color.LIGHT_GRAY;
		private Color oddColor=new Color(34, 134, 235);
		private Color selectedColor=Color.RED;
		private Color background;
		@Override
		public Component getListCellRendererComponent(JList<? extends String> list, String value, int index,
				boolean isSelected, boolean cellHasFocus)
		{
    
    
			text=value;
			
			
			list.setSelectionBackground(selectedColor);
			this.index=index;
			//根据是否选中得到动态的颜色
			ibackground = isSelected ? selectedColor : index%2==0? evenColor:oddColor;
			return this;
		}
		public void  paintComponent(Graphics g)
		{
    
    
			FontMetrics fm=g.getFontMetrics(font);
			
			g.setColor(background);
			g.fillRect(0, 0, getWidth(), getHeight());
			g.setColor(Color.GREEN);
			g.drawString(text,0 ,fm.getAscent());
		}
		@Override
		public Dimension getPreferredSize()
		{
    
    
			Graphics g=getGraphics();
			FontMetrics fm=g.getFontMetrics(font);
			return new Dimension(fm.stringWidth(text),fm.getHeight());
		}
		
		/*public Component getListCellRendererComponent(JList<? extends String> list, String value, int index,
				boolean isSelected, boolean cellHasFocus)
		{
			JLabel j1=new JLabel(value);
			
			j1.setOpaque(true);
			evenColor=Color.LIGHT_GRAY;
			oddColor=new Color(34, 134, 235);
			if(index%2==0) j1.setBackground(evenColor);
			else j1.setBackground(oddColor);
			
			j1.setFont(new Font(Font.SANS_SERIF,Font.PLAIN,16));
			if(isSelected) j1.setBackground(Color.YELLOW);
			
			return j1 ;
		}
		*/
	}
	
}

おすすめ

転載: blog.csdn.net/m0_47202518/article/details/108301520