2014-09-09 3 views
1

Я обновляю свой общий графический интерфейс для обработки данных, и я думал, что воспользуюсь uitable вместо списка uicontrol, чтобы отобразить пути и имена файлов загруженных файлов. Я заметил, что заголовки столбцов по умолчанию по умолчанию, и я не могу понять, как их выровнять, если имя файла длиннее ширины таблицы. Я проверил свойства, возвращенные get, и ткнул с findjobj, но не нашел ничего очевидного. Моя попытка использовать строку html также не увенчалась успехом.Изменение выравнивания заголовка заголовка?

Я пропустил что-то очевидное?

Пример кода:

function testcode 
res = get(0,'ScreenSize'); 
figdim = [1280 720]; % Main figure size, pixels 
handles.mainfig = figure(... 
    'Units', 'Pixels', ... 
    'Position', [(res(3) - figdim(1))/2 (res(4) - figdim(2))/2 figdim(1) figdim(2)], ... 
    'Name', 'Meep', ... 
    'Resize', 'off', ... 
    'DockControls', 'off', ... 
    'NumberTitle', 'off', ... 
    'Toolbar', 'figure' ... 
    ); 
handles.filetable = uitable(... 
    'Parent', handles.mainfig, ... 
    'Units', 'normalized', ... 
    'Position', [0.038 0.71 0.235 0.1], ... 
    'ColumnName', 'File Loaded', ... 
    'Data', {'None'} ... 
    ); 
handles.loadfilebtn = uicontrol(... 
    'Parent', handles.mainfig, ... 
    'Style', 'pushbutton', ... 
    'Units', 'normalized', ... 
    'Position', [0.075 0.85 0.16 0.07], ... 
    'String', 'This is a Button, Click', ... 
    'Callback', {@abutton} ... 
    ); 
guidata(handles.mainfig, handles); 
end 
function abutton(hObject,~) 
handles = guidata(hObject); 

filepath = 'C:\folder\folder\folder\folder\folder\folder\folder\folder\folder\superduperreallylongfilename.fileextension'; 
set(handles.filetable,'Data',{filepath}); 
set(handles.filetable,'ColumnWidth',{length(filepath)*5}); 

test = '<html><left />File Loaded</html>'; 
set(handles.filetable,'ColumnName',test); % Attempt #1, doesn't work 
end 
+0

Я не могу вспомнить, когда увидел такой хороший пример кода минимального кода для вопроса gui! +1 – thewaywewalk

ответ

2

Самый простой обходной путь я мог думать, чтобы разделить таблицу и таблицу-заголовка в двух отдельных uitables. Немного неудобно правильно устанавливать позиционные векторы, но в целом это работает как шарм. Важно: поместите «header-uitable» ниже (сначала в коде) «таблица данных». Таким образом, вы сохраняете некоторые проблемы.

function testcode 
close all 
res = get(0,'ScreenSize'); 
figdim = [1280 720]; % Main figure size, pixels 
handles.mainfig = figure(... 
    'Units', 'Pixels', ... 
    'Position', [(res(3) - figdim(1))/2 (res(4) - figdim(2))/2 figdim(1) figdim(2)], ... 
    'Name', 'Meep', ... 
    'Resize', 'off', ... 
    'DockControls', 'off', ... 
    'NumberTitle', 'off', ... 
    'Toolbar', 'figure' ... 
    ); 
handles.tableheader = uitable(... 
    'Parent', handles.mainfig, ... 
    'Units', 'normalized', ... 
    'Position', [0.038 0.71 0.235 0.1], ... 
    'ColumnName', 'File Loaded', ... 
    'ColumnWidth', {271} ... 
    ); 
handles.filetable = uitable(... 
    'Parent', handles.mainfig, ... 
    'Units', 'normalized', ... 
    'Position', [0.038 0.682 0.235 0.1], ... 
    'ColumnName', {}, ... 
    'Data', {'None'} ... 
    ); 
handles.loadfilebtn = uicontrol(... 
    'Parent', handles.mainfig, ... 
    'Style', 'pushbutton', ... 
    'Units', 'normalized', ... 
    'Position', [0.075 0.85 0.16 0.07], ... 
    'String', 'This is a Button, Click', ... 
    'Callback', {@abutton} ... 
    ); 
guidata(handles.mainfig, handles); 
end 
function abutton(hObject,~) 
handles = guidata(hObject); 

filepath = 'C:\folder\folder\folder\folder\folder\folder\folder\folder\folder\superduperreallylongfilename.fileextension'; 
set(handles.filetable,'Data',{filepath}); 
set(handles.filetable,'ColumnWidth',{length(filepath)*5}); 

end 

enter image description here

+0

Очень умный, спасибо! – excaza

+0

Умный действительно .. –

2

Вы упомянули findjobj, что позволяет получить JTable объект за вашим столом. То, что вы на самом деле пытаетесь сделать, это изменить некоторые свойства объекта header или JTableHeader. Как только вы знаете, что вы ищете, решение легко найти (например, это previous thread).

В заключение, поместите этот код в конце кнопки обратного вызова:

function abutton(hObject,~) 
%// .... 

hTable = handles.filetable; 
jScrollpane = findjobj(hTable); 
jTable = jScrollpane.getComponent(0).getComponent(0); 
%// You can see the list of components using findjobj(hTable).list 
%// Part1: 
dtcr = javaObject('javax.swing.table.DefaultTableCellRenderer'); 
dtcr.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); 
jTable.getColumn(jTable.getColumnName(0)).setHeaderRenderer(dtcr); 
%// Part2: 
jRenderer = jTable.getTableHeader().getDefaultRenderer(); 
jRenderer.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); 
%// Finalization: 
jTable.invalidate(); 

end 

При нажатии на кнопку, то приводит:

...the desired result

Несколько примечаний:

  1. Вот документация SwingConstants.
  2. Предполагается, что два Parts представляют собой два разных решения, но я заметил, что он работает только в том случае, если оба присутствуют (у меня нет объяснений).
  3. Я попытался установить это в функции создания фигуры, но это не сработало (у меня тоже нет объяснений).
  4. Протестировано на MATLAB 2014a.
+0

Хотя мне нравится этот подход java, это решение имеет главный недостаток: если вы прокрутите направо, заголовок исчезнет. – thewaywewalk

+1

Хотелось бы, чтобы я мог принять оба ответа. Использование существующего объекта - это то, что я надеялся найти, но @thewaywewalk поднимает хороший момент. Основная мотивация для этого - сделать интерфейс более визуально привлекательным, а другой ответ, в то время как довольно взломанный, лучше выполняет цель. Спасибо вам всем :) – excaza

+0

@thewaywewalk - я согласен с вами. Это то, что я понял, что ФП хотел (надеюсь, после рассмотрения возможных альтернатив и недостатков). –

Смежные вопросы