JList中的多行java [英] Multiple lines in JList java

查看:149
本文介绍了JList中的多行java的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在从事有关学校管理的学校项目。在我的项目中,可以创建一个学校,教育和学生。我正在将它们全部添加到同一个JList(School)中,这给我一个问题。每当我添加例如学生,它将进入JList上的同一行,这使得它太久了,我希望有一种方法来做这样的事情:



学校1

  - 教育1

    - 学生1

    - 学生2

  - 教育2

    - 学生3

学校2



等。



我一直在阅读关于使用单元格渲染器,但我不确定它是否工作,因为我没有创建一个表。请给我建议使用什么。



祝贺
Jakob



Btw我不想使用TextArea,因为我想挑战自己。

解决方案


我一直在阅读关于使用单元格渲染器,但我不确定它是否工作,因为我没有创建一个表。


有不同的渲染器为不同的组件。 JList 有一个 JTabele 您需要使用 ListCellRender ,它是 JList 单元格的渲染器。渲染器使用组件来包含其内容。使用组件,您不能使用下一行\\\
,因此您需要使用HTML。



您可以在这里查看更多 ListCellRenderer



这里有一个例子,我使用学生对象作为列表的值

  class Student {
String name;
int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){return name; }
public int getAge(){return age; }
}

这里是渲染的一部分,我设置文本



  @Override 
public Component getListCellRendererComponent(
JList list,Object value,int index,
boolean isSelected,boolean cellHasFocus){
super.getListCellRendererComponent(list,value,index,isSelected,cellHasFocus);
学生标签=(学生)值;
String name = label.getName();
int age = label.getAge();
String labelText =< html> + name +< br />年龄;
setText(labelText);

返回此;
}

以下是完整示例

  import java.awt.Component; 
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.SwingUtilities;


public class Test3 {

JList< Student>列表;
DefaultListModel模型;

public Test3(){
list = new JList();
model = new DefaultListModel(); (int i = 0; i< 10; i ++){
model.addElement(new Student(Paul+ i,i));

}
list.setModel(model);
list.setCellRenderer(new MyListCellRenderer());

JFrame frame = new JFrame(Test);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(list);
frame.pack();
frame.setVisible(true);
}

public static void main(String [] args){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
new Test3();
}
});
}

private class MyListCellRenderer extends DefaultListCellRenderer {

@Override
public Component getListCellRendererComponent(
JList list,Object value,int index,
boolean isSelected,boolean cellHasFocus){
super.getListCellRendererComponent(list,value,index,isSelected,cellHasFocus);
学生标签=(学生)值;
String name = label.getName();
int age = label.getAge();
String labelText =< html> Name:+ name +< br /> Age:+ age;
setText(labelText);

返回此;
}

}
}

class学生{
字符串名称;
int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){return name; }
public int getAge(){return age; }
}


I'm currently working on a school project regarding school administration. In my project it is possible to create a school, education and students. I'm currently adding them all into the same JList(School), and it is giving me one problem. Whenever I'm adding for example a student it goes into the same line on the JList which makes it too long and I'm hoping for a way to do something like this on it:

School 1
 - Education 1
   - Student 1
   - Student 2
 - Education 2
   - Student 3
School 2
etc.
etc.

I've been reading about using cell renderer but I'm not sure that it works since I'm not creating a table. Please advice me about what to use.

Regards Jakob

Btw I don't want to use TextArea since I want to challenge myself.

解决方案

"I've been reading about using cell renderer but I'm not sure that it works since I'm not creating a table. "

There are different renderers for different components. JList has one and so does a JTabele You need to use a ListCellRender, which is a renderer for a JList cell. The renderer uses a Component to contain its content. With Component you can't use the next line carriage "\n", so you need to use HTML.

You can see more here ListCellRenderer

Here's an example, where I use a Student Object as the value for the list

class Student {
    String name;
    int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() { return name; }
    public int getAge() { return age; }
}

And here is the part of the render where I set the text

@Override
public Component getListCellRendererComponent(
        JList list, Object value, int index,
        boolean isSelected, boolean cellHasFocus) {
    super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    Student label = (Student) value;
    String name = label.getName();
    int age = label.getAge();
    String labelText = "<html>" + name + "<br/>" + age;
    setText(labelText);

    return this;
}

Here's the complete example

import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.SwingUtilities;


public class Test3 {

    JList<Student> list;
    DefaultListModel model;

    public Test3() {
        list = new JList();
        model = new DefaultListModel();
        for (int i = 0; i < 10; i++) {
            model.addElement(new Student("Paul" + i, i));
        }
        list.setModel(model);
        list.setCellRenderer(new MyListCellRenderer());

        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(list);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Test3();
            }
        });
    }

    private class MyListCellRenderer extends DefaultListCellRenderer {

        @Override
        public Component getListCellRendererComponent(
                JList list, Object value, int index,
                boolean isSelected, boolean cellHasFocus) {
            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            Student label = (Student) value;
            String name = label.getName();
            int age = label.getAge();
            String labelText = "<html>Name: " + name + "<br/>Age: " + age;
            setText(labelText);

            return this;
        }

    }
}

class Student {
    String name;
    int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() { return name; }
    public int getAge() { return age; }
}

这篇关于JList中的多行java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆