2016-08-03 3 views
5

Вот контекст, если это необходимо для любых ответов. Я создаю двигатель, в котором я собираюсь сделать видеоигр. Он содержит таблицу букв 96 x 54 (столбцы x строк), чтобы обеспечить равномерное расстояние между ними. Из-за этого было бы очень полезно, если бы любые решения могли быть как наименее ресурсоемкими, так и разумно достижимыми. Я сделал веб-демо для этого движка, который работал точно так, как предполагалось, кроме того, что он немного медленный. Теперь я переношу проект на Java, и некоторые вещи работают не так, как предполагалось.Разрешить текст в нескольких JLabels для перекрытия

Чтобы имитировать HTML <table> Я использовал GridLayout из JLabel S внутри пары JPanel с, чтобы держать проклейки постоянным, все внутри JFrame. Проблема, с которой я сталкиваюсь, заключается в том, что из-за изменения размера таблицы для улучшения внешнего вида JLabels немного перекрываются. В веб-демо это было прекрасно, так как письма просто вошли в следующую коробку. Это то, чего я пытаюсь достичь на Java, и не могу, чтобы жизнь меня узнала, как это сделать.

Вот изображение, чтобы показать вам, что я имею в виду:

Here's an image to show you what I mean.

В веб-демо на левой мы имеем круг подчеркиванием внутри круга «а» с, а буквы «pqyjg " справа. На одном из символов подчеркивания также имеется небольшая серая рамка. Это выделенный поле ниже подчеркивание, показывающее, что подчеркивание перекрывает 1 пиксель в нем.

Когда мы помещаем этот же код в версию Java, подчеркивания нигде не видны, а хвосты на буквах «pqyjg» отключены. Желаемый эффект заключается в том, чтобы он работал как пример слева.

Я искал этот сайт, остальную часть Интернета и на многих страницах класса Java в поисках метода, который поможет, но безрезультатно.

Может ли кто-нибудь указать мне класс или метод, которые я мог бы вызвать на JLabel или любой другой компонент для достижения этого эффекта, не меняя размер таблицы?

Вот мой текущий код для настройки на все, если это кому-то поможет.

import javax.swing.*; 
import static java.lang.Math.*; 
import java.awt.*; 

public class transparencyExample{ 

    //Declaring constants 
    public static final Color[] MAINFRAME = {new Color(0x35ce4a), new Color(0x111111)}; 

    //Creating static variables and methods 
    private static JLabel tempLabel; 
    private static JLabel[][] table = new JLabel[54][96]; 
    private static JPanel layout = new JPanel(new GridLayout(54,96)); 
    private static JPanel background = new JPanel(); 
    private static BoxLayout box = new BoxLayout(background, 0); 
    private static JFrame frame = new JFrame("Transparency Example"); 
    private static void initialise(){ 

     //Adding labels to table 
     for (int i = 0; i < 5184; i++){ 
      tempLabel = new JLabel("M", SwingConstants.CENTER); 
      tempLabel.setFont(new Font("Courier", Font.PLAIN, 15)); 
      table[(int) floor((double) i/96)][i % 96] = tempLabel; 
     } 

     //Laying out the table 
     layout.setPreferredSize(new Dimension(1056, 594)); 
     layout.setOpaque(false); 
     for(int i = 0; i < 5184; i++){ 
      layout.add(table[(int) floor((double) i/96)][i % 96]); 
     } 
     background.setBackground(MAINFRAME[1]); 
     background.add(layout); 

     //Laying out the frame 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(background); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    //Fill table 
    public static void fill(String s){ 
     for(int i = 0; i < 5184; i++){ 
      table[(int) floor((double) i/96)][i % 96].setText(String.valueOf(s.charAt(i))); 
     } 
    } 
    public static void main(String[] args){ 
     initialise(); 
     transparencyExample.fill("                                                                                                                                                                                                                                                                                                                                                                               aaaaaaaa                      a a aa                     a _____  a                     a _  ___ a                     a_   __ a                    a _   _ a  pqyjg                 aa _   _ a                    a _    _ a                   a _    _ a                   a _    _ a                   a _    _ a                   a _   _ a                   a __   _ a                   a  __  __ a                    a  _______ a                    a    a                    a    aa                    aa   a                     aa  aa                      aa aaaa                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         "); 
    } 
} 
+0

Здравствуйте и добро пожаловать. Для того, чтобы помочь нам лучше понять вашу проблему, рассмотрите упрощение и улучшение вашего опубликованного кода таким образом, чтобы он: 1) не имеет внутри кода никакого отношения к вашей проблеме, 2) очень мало, 3) компилирует и запускает немодифицированный, то есть , это целый класс/программа сам по себе и 4) демонстрирует вашу проблему для нас, [mcve]. Этот код должен быть размещен здесь, как вы сейчас делаете, а не в ссылке. –

+0

Например, я не могу в настоящее время запускать ваш код выше, так как он имеет зависимости, к которым у меня нет доступа, включая MAINFRAME, floor (...), ресурс изображения ... и он не размещен как компилируемый и исполняемый файл класса, в комплекте с заголовком класса и импортом. –

+0

... и я не 100% в отношении эффекта, который вы пытаетесь создать, и проблем, которые могут возникнуть у вас, но часто проблемы в этой категории связаны с попыткой искусственного ограничения размеров компонентов и контейнеров. –

ответ

3

За мой комментарий:

...и я не 100% в отношении эффекта, который вы пытаетесь создать, и проблем, которые могут возникнуть у вас, но часто проблемы в этой категории связаны с попыткой искусственного ограничения размеров компонентов и контейнеров.

Да, ваша проблема заключается в том, что вы искусственно ограничиваете размер вашего макета JPanel с помощью layout.setPreferredSize(new Dimension(1056, 594));, и это предотвращает отображение всех компонентов, которые он удерживает. Если вы избавитесь от этой строки, а затем вы упакуете и установитеVisible (true) свой JFrame, после, заполнив его данными, вы увидите полный текст.


Ваш комментарий:

Я пытался сохранить размер таблицы то же самое, но вместо того, чтобы позволить JLabels перекрываться так, что их текст может переливаться из одного в другой.

Рассмотрим вариант 2: не используйте компоненты JLabel, а нарисовать нужный текст непосредственно в либо BufferedImage, который отображается в вашем методе paintComponent JPanel или непосредственно внутри самого метода paintComponent в JPanel в.

+0

Я пытался сохранить размер таблицы одинаково, но вместо этого перекрывал 'JLabel' перекрытие, чтобы их текст мог перетекать из одного в другой. Я постараюсь сделать это более ясным на этом посту, извините. –

+0

@ TheG-Meister: см. Править для ответа –

+0

Насколько это интенсивно? И идея заключалась в том, чтобы сделать текст легко редактируемым, допустил бы этот метод? –

1

Если я хорошо понял, одна часть вашего вопроса - как установить цвет фона JLabel? Если да, то:

label.setOpaque(true); 
label.setBackground(Color.lightGray);// Background color 

Я изменил свой код, чтобы изменить размер всего окна. Тогда проблема видна, когда размер шрифта будет большим, чтобы вписаться в пространство метки. На мой взгляд, вы должны рассчитать размер шрифта в зависимости от размера этикетки, что-то похожее на это: https://stackoverflow.com/a/19194949/4448511

import javax.swing.*; 
import static java.lang.Math.*; 
import java.awt.*; 



public class testG { 

    //Declaring constants 
    //public static final Color[] MAINFRAME = {new Color(0x35ce4a), new Color(0x111111)}; 
    public static final Color[] MAINFRAME = {Color.GREEN, Color.BLACK}; 

    //Creating static variables and methods 
    private static JLabel tempLabel; 
    private static JLabel[][] table = new JLabel[54][96]; 
    private static JPanel layout = new JPanel(new GridLayout(54,96)); 
    private static JPanel background = new JPanel(new BorderLayout()); 
    private static BoxLayout box = new BoxLayout(background, 0); 
    private static JFrame frame = new JFrame("Transparency Example"); 
    private static void initialise(){ 

     //Adding labels to table 
     for (int i = 0; i < 5184; i++){ 
      tempLabel = new JLabel("M", JLabel.CENTER); 
      //tempLabel.setFont(new Font("Courier", Font.PLAIN, 15)); 
      tempLabel.setForeground(Color.GREEN); 
      tempLabel.setBorder(BorderFactory.createLineBorder(Color.BLUE)); 
      table[(int) floor((double) i/96)][i % 96] = tempLabel; 

     } 

     //Laying out the table 
     //layout.setPreferredSize(new Dimension(1056, 594)); 
     layout.setOpaque(false); 
     for(int i = 0; i < 5184; i++){ 
      layout.add(table[(int) floor((double) i/96)][i % 96]); 
     } 
     background.setBackground(MAINFRAME[1]); 
     background.add(layout, BorderLayout.CENTER); 

     //Laying out the frame 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(background); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    //Fill table 
    public static void fill(String s){ 
     for(int i = 0; i < 5184; i++){ 
      JLabel labelTemp = table[(int) floor((double) i/96)][i % 96]; 
      labelTemp.setText(String.valueOf(s.charAt(i))); 
     } 
    } 
    public static void main(String[] args){ 
     initialise(); 
     testG.fill("                                                                                                                                                                                                                                                                                                                                                                               aaaaaaaa                      a a aa                     a _____  a                     a _  ___ a                     a_   __ a                    a _   _ a  pqyjg                 aa _   _ a                    a _    _ a                   a _    _ a                   a _    _ a                   a _    _ a                   a _   _ a                   a __   _ a                   a  __  __ a                    a  _______ a                    a    a                    a    aa                    aa   a                     aa  aa                      aa aaaa                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         "); 
    } 

} 
+0

Если вы посмотрите на изображение и код, я уже сделал это, извините. Что вы читали, что заставило вас подумать об этом, между прочим? Если я смогу прояснить это, это помешает другим людям совершить ту же ошибку. –